私のアプリケーションでは、データベースに挿入する必要がある多数 (100 以上) の行があります。それらがデータベースに挿入されたら、子への外部キー参照を持つ子を挿入する必要があります。
これらすべての行を挿入し、それらの ID をアプリケーションに返すことができるストアド プロシージャを作成する方法があるかどうか疑問に思っています。
私のアプリケーションでは、データベースに挿入する必要がある多数 (100 以上) の行があります。それらがデータベースに挿入されたら、子への外部キー参照を持つ子を挿入する必要があります。
これらすべての行を挿入し、それらの ID をアプリケーションに返すことができるストアド プロシージャを作成する方法があるかどうか疑問に思っています。
質問に table-value-parameters のタグを付けました - これらの 1 つをストアド プロシージャに渡して、データベースに挿入することができます。
OUTPUT
句をINSERTED
論理テーブルで使用して、新しい ID 値を取得し、ストアド プロシージャからそれらを返すことができます。
output
Odedが提案したように、句を使用する例を次に示します。まず、いくつかのセットアップ コード:
if exists (select * from tempdb.sys.tables where name like '#tmp%')
drop table #tmp
create table #tmp (id int identity, FirstName varchar(50), LastName varchar(50))
if exists (select * from sys.procedures where name = 'TestProcedure')
drop procedure TestProcedure
if exists (select * from sys.types where name = 'TestTableType')
drop type TestTableType
create type TestTableType as table (FirstName varchar(50), LastName varchar(50))
go
これで、ストアド プロシージャを作成できます。
create procedure dbo.TestProcedure
@List TestTableType readonly
as
insert #tmp
(FirstName, LastName)
output inserted.*
select FirstName
, LastName
from @List l
go
output
ID 列の値を含め、挿入された行をクライアントに返すように SQL Server に指示する句に注意してください。コードがすべて設定されたので、テストできます。
declare @List TestTableType
insert @List values ('Rick','Cain'),
('Herman', 'Gingrich'),
('Newt', 'Paul'),
('Ron', 'Perry')
exec dbo.TestProcedure @List
select * from #tmp
プロシージャによって返された値が の値と#tmp
正確に一致することがわかります。
Andomar の提案と同様のことを行いますが、ここで説明する「INSERT-EXEC」手法を使用します。
http://www.sommarskog.se/tableparam.html
リンクで、INSERT-EXEC を検索します。
私はまだこれを行う方法を研究していますが、親テーブルと子テーブルを挿入したい場合は、両方のテーブルをテーブル値パラメーターとして渡すことで 1 つの SQL 呼び出しで実行できるようです。現在、行番号のように 2 つのテーブルをリンクしているが、必ずしもどちらの DB テーブルにも格納されていない人工的な ID (関係) がある場合、親が挿入されてその ID 値を取得すると、子テーブルに結合される可能性があります。一意の関係を使用すると、子の外部キーを更新できます。その後、子供を挿入できます。
出力は興味深いですが、実際には出力は必要ありません。単に sproc 内で使用する必要があるため、出力を一時的に出力するなどして使用できるかどうかを確認するために、さらに調査を行う必要があります。テーブル。
私自身の質問に答える出力の構文は次のとおりです。
[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
そのため、子と結合された一時テーブルを作成するために使用できます。