とりわけ、ループ内の別のテーブルにいくつかの挿入を行うストアド プロシージャがあります。より明確に理解するために、以下の例を参照してください。
INSERT INTO T1 VALUES ('something')
SET @MyID = Scope_Identity()
... some stuff go here
INSERT INTO T2 VALUES (@MyID, 'something else')
... The rest of the procedure
これらの 2 つのテーブル (T1 と T2) には、それぞれに IDENTITY(1, 1) 列があります。ID1 と ID2 と呼びましょう。しかし、実稼働データベース (非常にビジーなデータベース) で手順を実行し、各テーブルに 6250 を超えるレコードがあった後、ID1 が ID2 と一致しない 1 つのインシデントに気付きました! 通常、T1 に挿入されたレコードごとに、T2 に挿入されたレコードがあり、両方の ID 列が一貫してインクリメントされます。
「間違った」レコードは次のようなものでした。
ID1 Col1
---- ---------
4709 data-4709
4710 data-4710
ID2 ID1 Col1
---- ---- ---------
4709 4710 data-4710
4710 4709 data-4709
2 番目の表の「反転された」ID1 に注意してください。
操作の下にあるSQL Serverについてあまり知らないので、次の「理論」を入れました。誰かがこれを修正してくれるかもしれません。
私が思うに、ループはテーブルへの物理的な書き込みよりも高速であり、および/またはおそらく他の何かが書き込みプロセスを遅らせたため、レコードはバッファリングされました。それらを書く時が来ると、それらは順不同で書かれました。
いいえ、上記のシナリオを説明する方法はありますか?
はいの場合、別の質問があります。最初の挿入 (上記のコードから) が遅れた場合はどうなりますか? それは、2 番目のテーブルに挿入する正しい IDENTITY を取得できないということではないでしょうか? この答えも「はい」の場合、2 つのテーブルへの挿入が正しい IDENTITY で順番に行われるようにするにはどうすればよいでしょうか?
これを理解するのに役立つコメントや情報に感謝します。
前もって感謝します。