web-dev-qa-db-ja.com

ユーザー定義テーブルをストアドプロシージャに渡す

ストアドプロシージャ内からストアドプロシージャに渡すユーザー定義テーブルがあります。

DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

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

これでエラーは発生しませんが、ValidateInputXMLを使用してselect fromを実行すると、テーブルにデータがありません。

9
Steven

ストアドプロシージャにTable-Valuedパラメータを使用することもできます。例えば。

/* 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
17
vendettamit

ユーザー定義テーブルのスコープは、ストアドプロシージャにあります。ストアドプロシージャが実行されると、テーブル@tmpInputが作成されて入力され、その後はアクセスできなくなります。

ドキュメントから:

変数のスコープは、宣言された時点から、宣言されたバッチまたはストアドプロシージャの終わりまで続きます。

2つのオプションがあります。

オプション1:

レコードを永続的に保存できるテーブルを作成します。

オプション2:

select次のようなストアドプロシージャ内のレコード:

alter procedure ValidateInputXML 
DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

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

その後

exec ValidateInputXML 
0
Rahul Tripathi