Ist es möglich, einen Tabellenwertwert an eine gespeicherte Prozedur weiterzugeben und ein Tabellenergebnis zurückzugeben?

Ich möchte eine gespeicherte Prozedur erstellen, die ein Tabellenargument annimmt und eine separate (Schema-) Tabellenergebnismenge zurückgibt.

Erstens ist das möglich?

Zweitens bin ich auf dem richtigen path oder ganz aus?

Meine Vorgehensweise Definition

USE MyDatabaseName -- drop the procedure so we can recreate it IF (OBJECT_ID('doit')) is NOT NULL DROP PROCEDURE doit GO -- drop and recreate the type in case we want to change how its defined IF TYPE_ID(N'MyTableType') IS NOT NULL DROP TYPE MyTableType CREATE TYPE MyTableType AS TABLE(keyvalue bigint NOT NULL, datevalue date NOT NULL) GO -- create procedure CREATE PROCEDURE doit ( @indata MyTableType READONLY ) AS -- Ultimately, real work will be done here that accumulates -- a result set and returns it. For now, we just return -- a sub-set of what we were passed to see if this will -- work...Which, it doesn't seem to. RETURN SELECT top 100 keyvalue, datevalue FROM @indata GO 

Mein Anrufcode:

 -- Call the doit procedure declare @myargtable MyTableType -- Gather my 'doit' argument INSERT INTO @myargtable select top 1000 my_bigint_field, my_date_field from my_source_table; -- This output is what I expect 'doit' to produce. select top 100 * from @myargtable -- Get a result table ready for the output of 'doit' declare @results MyTableType -- Store the results. insert into @results EXEC doit @myargtable -- I expect this to give me 100 records like above. -- But, it gives me none. select * from @results 

Entfernen Sie die RETURN aus der SP-Definition, so dass die Zeile gerade ist

 SELECT top 100 keyvalue, datevalue FROM @indata 

Eine gespeicherte Prozedur kann nur einen int als Rückgabewert zurückgeben.

Vielleicht hast du entweder einfach deine Ergebnisse SELECT , um sie zurückzugeben:

 CREATE PROCEDURE doit ( @indata MyTableType READONLY ) AS SELECT top 100 keyvalue, datevalue FROM @indata RETURN 0 

Oder verwenden Sie stattdessen eine Tabellenwertfunktion:

 CREATE FUNCTION doit ( @indata MyTableType READONLY ) RETURNS @t TABLE ( keyvalue bigint, datevalue date ) AS insert into @t select top 100 keyvalue, datevalue from @indata return 

Oder sogar eine Inline-function:

 CREATE FUNCTION doit ( @indata MyTableType READONLY ) RETURNS TABLE AS RETURN ( select top 100 keyvalue, datevalue from @indata )