4

重複の可能性:
挿入された行のIDを取得する最良の方法は?

多くのオンラインユーザーがいるソーシャルネットワークのような大規模なWebアプリケーションがあると仮定します。

ユーザーは、特定のテーブルに新しい行を継続的に挿入します。このアプリケーションでは、挿入するたびに新しい行のIDが必要であり、このIDは自動的に増加するint列です。

最後のrawのIDの取得は、SQLによってSELECT IDENT_CURRENT()、ユーザーごとにWebアプリケーションを介した個別の関数呼び出しとして実行されます。

複数のユーザーが同時に行を挿入した場合、正しく機能し、正しいIDを返しますか?

4

3 に答える 3

3

別の保存バージョン..。

Insert Atab (na,nu)
OUTPUT INSERTED.id  
values('Text','Add') 

INSERT、UPDATE、DELETE、またはMERGEステートメントの影響を受ける各行からの情報またはそれに基づく式を返します。これらの結果は、確認メッセージ、アーカイブ、およびその他のそのようなアプリケーション要件などで使用するために、処理アプリケーションに返すことができます。結果は、テーブルまたはテーブル変数に挿入することもできます。さらに、ネストされたINSERT、UPDATE、DELETE、またはMERGEステートメントでOUTPUT句の結果をキャプチャし、それらの結果をターゲットのテーブルまたはビューに挿入できます。

参照

于 2013-01-15T18:37:59.990 に答える
3

私たちの会社の誰かが、scope_identity を使用すべき場所で ident_current を使用しました (そして、現在は OUTPUT を使用する必要があります)。何百万ものレコードのデータ インポートが実行されているのと同時に、アプリケーションがレコードを挿入していたことがありました。その後のレコードのインポートで間違った ID が子レコードに添付され、データの整合性の問題が発生し、その問題を特定して修正するのに長い時間がかかりました。挿入したばかりの値を取得するために ident_current を使用する必要がある状況はありません。これは、データの完全性の問題を保証するものです。

OUTPUT を使用できるバージョンの SQL サーバーを使用している場合は、この方法が推奨されます。OUTPUT は、挿入されたばかりの ID を提供するだけでなく、挿入された他の値も提供できるため、複数のレコード挿入の値を単一のレコード挿入と同様に簡単に取得できます。削除されたものや削除されたものを見つけるためにも使用できます。更新しました。そのため、非常に価値のあるツールです。基本的に、必要な列を含むテーブル変数を設定し、INSERT、UPDATE、または DELETE で OUTPUT 句を使用します。その後、テーブル変数を使用して、他の処理ステップに必要な情報を取得できます。挿入ステートメントで出力を使用して何ができるかを確認するためのいくつかの例:

DECLARE @MyTableVar table( MyID int,
                           MyName varchar(50));

INSERT MyTable1 (MYName)
    OUTPUT INSERTED.MyID, INSERTED.MyName
        INTO @MyTableVar
VALUES ('test');

--Display the result set of the table variable.
SELECT MyID, MyName FROM @MyTableVar;
--Display the result set of the table.
Insert into table2 (MyID,test2, test2)
SELECT MyID, 'mttest1', 'mytest2'  FROM @MyTableVar;

Insert into table2 (MyID,field1, InsertedDate)
SELECT MyID, s.Field1, getdate()  FROM @MyTableVar t
join stagingtable s on t.MyName =  s.MyName
于 2013-01-15T20:19:53.570 に答える
2

代わりに SCOPE_IDENTITY() を使用することをお勧めします。以下は、@@IDENTITY、IDENT_CURRENT()、および SCOPE_IDENTITY (ここから盗まれた)の違いの内訳です。

SELECT @@IDENTITY 値を生成したテーブルや、値を生成したステートメントのスコープに関係なく、接続で生成された最後の IDENTITY 値を返します。@@IDENTITY は、現在のセッションでテーブルに最後に入力された ID 値を返します。@@IDENTITY は現在のセッションに限定されますが、現在のスコープに限定されません。ID を別のテーブルに作成するトリガーがテーブルにある場合、ID を作成したのがトリガーであっても、最後に作成された ID が取得されます。

SELECT SCOPE_IDENTITY() 値を生成したテーブルに関係なく、接続上および同じスコープ内のステートメントによって生成された最後の IDENTITY 値を返します。SCOPE_IDENTITY() は、@@IDENTITY と同様に、現在のセッションで作成された最後の ID 値を返しますが、現在のスコープにも制限されます。つまり、トリガーまたはユーザー定義関数によって作成された ID ではなく、明示的に作成された最後の ID 値が返されます。

SELECT IDENT_CURRENT('tablename') 値を作成した接続や、値を作成したステートメントのスコープに関係なく、テーブルで最後に作成された IDENTITY 値を返します。IDENT_CURRENT はスコープとセッションによって制限されません。指定されたテーブルに限定されます。IDENT_CURRENT は、任意のセッションおよび任意のスコープで特定のテーブルに対して生成された ID 値を返します。

ご覧のとおり、SCOPE_IDENTITY() は、スコープ内のステートメントによって現在の接続によって生成された最後の ID を返します。あなたが求めていることに基づいて、これはあなたのニーズによりよく合うように思えます.

于 2013-01-15T18:28:08.407 に答える