5

Mam tabelę definiowaną przez użytkownika, którą przechodzę do procedury składowanej z poziomu procedury składowanej.Przejście tabeli zdefiniowanej przez użytkownika do przechowywanej procedury

DECLARE @tmpInput MyTableType; 

--Table is populated from an INPUT XML 

exec ValidateInputXML SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 

Teraz nie daje mi błąd, ale gdy uruchomię select z ValidateInputXML tabela nie ma danych.

Odpowiedz

10

Można również wykorzystać wycenione tabela parametr dla Twojego przechowywane procedura. E.g.

/* Create a table type. */ 
CREATE TYPE MyTableType AS TABLE 
(Column1 VARCHAR(50) 
, ........); 
GO 

/* Create a procedure to receive data for the table-valued parameter. */ 
CREATE PROCEDURE dbo. ValidateInputXML 
    @TVP MyTableType READONLY 
    AS 
    -- Do what ever you want to do with the table received from caller 
    GO 

/* Declare a variable that references the type. */ 
DECLARE @myTable AS MyTableType; 

-- Fill @myTable with data and send it to SP. 
insert into @myTable SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 


/* Pass the table variable data to a stored procedure. */ 
EXEC ValidateInputXML @myTable ; 
GO 
+0

Nie jestem świadomy, czy można przekazać zestaw rekordów bezpośrednio do procedur składowanych bez korzystania z typów tabel. Daj mu kolejną myśl. – vendettamit

+1

To jest styl rozwiązania, z którym współpracowaliśmy. – Steven

0

Zakres tabeli zdefiniowanej przez użytkownika znajduje się w procedurze przechowywanej. Po wykonaniu procedury przechowywanej zostanie utworzona i zapełniona tabela @tmpInput, a następnie nie będzie można uzyskać do niej dostępu.

Z dokumentów:

zakres zmiennej trwa od miejsca, w którym jest zadeklarowany do koniec partii lub procedury przechowywanej w którym jest zadeklarowane.

Masz dwie opcje:

Wariant 1:

Utwórz tabelę, w której można przechowywać rekordy na stałe.

Opcja 2:

select rekordy od wewnątrz procedury przechowywanej jak:

alter procedure ValidateInputXML 
DECLARE @tmpInput MyTableType; 

--Table is populated from an INPUT XML 

SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 

a następnie

exec ValidateInputXML