2

1つのトランザクションで2つの行を追加する方法がわからず、そのうちの1つは別の行に依存しています。

INSERT INTO users (username) VALUES ('malcom.reynolds')

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', <<Malcom Reynold's row ID>>)

私が行っている理由は、使用しているライブラリがROWIDを返さないためです。数百万を超えるレコードを追加しているため、トランザクションをできるだけ少なくコミットする必要があります。

私が使用している記録のためだけに:

  • SQL Server 2008
  • Python
  • pyodbc

何か案が?本当に素晴らしいでしょう:)

4

4 に答える 4

4

http://msdn.microsoft.com/en-us/library/aa259185%28SQL.80%29.aspxを見てください

INSERT INTO users (username) VALUES ('malcom.reynolds');

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', SCOPE_IDENTITY() )
于 2010-12-15T19:58:08.367 に答える
4

T-SQLを使用して、最初のステートメントscope_identityから新しいIDを返すことができます。INSERT

最初のの前INSERTに、新しいIDの値を保持する変数を宣言します。

DECLARE @ReturnValue int;

最初の直後に、INSERTこれを追加してその変数の値を設定します。

SELECT @ReturnValue = scope_identity()

次に、次の代わりに@ReturnValue2番目の変数を使用できます。INSERT

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', @ReturnValue)
于 2010-12-15T19:58:28.180 に答える
4

これは、1つのバッチステートメントで実行できます。

declare @key as int;
insert into users (username)
values ('malcom.reynolds');
set @key = (select scope_identity());
insert into spaceships (name, owner)
values ('Serenity', @key)
于 2010-12-15T19:59:08.220 に答える
2

または、OUTPUTを使用できます。これは、複数のフィールドを返す必要がある場合、または最初にマルチトロー挿入を実行している場合に便利です。int変数の代わりに複数の行を実行している場合は、テーブル変数を使用できます。

DECLARE @key int
insert into users (username)
output inserted.userid 
values ('malcom.reynolds'); 

insert into spaceships (name, owner) 
values ('Serenity', @key) 
于 2010-12-15T20:20:16.717 に答える