6

私は2つのテーブルを持っており、一方が他方に対して外部キー関係を持っています

CREATE TABLE foo (
  id INT NOT NULL PRIMARY KEY IDENTITY,
  value VARCHAR(50) DEFAULT NULL,
);

CREATE TABLE bar (
  id INT NOT NULL PRIMARY KEY IDENTITY,
  foo_key INT NOT NULL
  value VARCHAR(50) DEFAULT NULL,
);

パラメータ化されたADO.NETExecuteReaderを使用して新しい行を挿入しています。私のピクルスは、同じトランザクションで異なるテーブルに2行を挿入したい場合、つまりコミットする前に、foo.idがまだ与えられている値がわからないため、バーに行を挿入できないことです。どうやってそれをやりますか?つまり、bar.foo_keyに正しい値が割り当てられていることを確認するにはどうすればよいですか?実際にはまだそこにないので、それを選択しようとしても何も起こりません。ストアドプロシージャを使用してその場でキーを生成しようとする必要がありますか、それとも使用できる内部変数があるかもしれません。または、インサートに新しいIDを返す方法はありますか?外部キー宣言が必要ですか?それが役立つかどうかはわかりませんが、使用するIDがまだわからないためです。

一度にやりたい理由は、エラー処理のためです。エラーが発生した場合にすべてをロールバックできるようにしたいのです。

4

2 に答える 2

5

scope_identity()新しく生成されたものを取得するために使用できますidentity

begin tran;
insert Foo (value) values ('6*7');
declare @fk int = scope_identity();
insert bar (foo_key, value) values (@fk, '42');
commit tran;

HLGEMのコメントによると、新しく生成されたIDの値をクライアントに返すには、次を使用できますoutput

insert Foo (value) output inserted.ID values ('6*7');

トランザクションが2つのセッションにまたがるには、分散トランザクションが必要であり、これは非常にコストがかかることに注意してください。

于 2013-03-25T20:15:18.523 に答える
0

挿入時にscope_identity()を返すことができることがわかりました

INSERT INTO [foo] ([value]) VALUES (@0) SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
于 2013-03-25T20:41:53.657 に答える