2012-02-21 43 views
2

私はasp.netアプリケーションのバックエンドとしてSQL Serverを持っています。複数の人が同じテーブルに同じ時間にデータを挿入する可能性があります。IDENT_CURRENTは最後のID値を返しますが、SCOPE_IDENTITYは返しません。

私はこの記事からソリューション/答えを読む:scope_identity vs ident_current

私は別のユーザーの挿入のIDを取得する可能性があるため、その後、私はIdent_currentを使用しないでください。

Select Scope_Identity();を使用すると、Select IDENT_CURRENT('tableName')が私にSQL Server Management Studioでチェックした正しいIDを返す間にNULLが返されます。

SqlTransactionの中に挿入文があります。 Select IDENT_CURRENT('tableName')は取引後に行われます。

どうしますか?

UPDATE

マイ挿入ステートメントを動的ベースクラスで一緒に構築されています

INSERT INTO TEST (NAME) VALUES (@Name) 
コマンドのパラメータコレクションは、値「XXX」とすべてが正常に表に挿入された

C#で純粋なSqlDataReaderのストアドプロシージャは使用しません。

commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();" 

どのように私は上記のステートメントを実行している最後の自動INC IDを取得することができますし、それは混乱だINSERTSELECTを持っているので、私はExecuteNonQuery以上のためExecuteReader呼び出す必要があります...

+1

insertコマンドを表示します。先週の似たような質問で私の答えを見てください。多分助かりました。http://stackoverflow.com/questions/9319532/return-value-from-sql-server-insert-command-using-c-sharp/9319609 #9319609同じスコープ内でscope_identityを使用する必要があります。 –

+2

おそらく、2つのコマンドを完全に独立して実行しました。 –

+0

私はそれらを独立して実行します。 – Pascal

答えて

4

だけOUTPUT Clause (Transact-SQL)を使用あなたはデータを挿入し、同じ文の中で、すべての(偶数倍)のIDを選択することができますバック:

INSERT INTO TEST (NAME) OUTPUT INSERTED.YourIdentity VALUES (@Name) 

作業例:

DECLARE @YourTable table (YourIdentity int identity(1,1) primary key, YourCol1 varchar(5)) 

INSERT INTO @YourTable (YourCol1) OUTPUT INSERTED.YourIdentity VALUES ('ABC') 

OUTPUT:

YourIdentity 
------------ 
1 

(1 row(s) affected) 
+0

変数の最後の行IDを再利用しないと読み込む必要はありません。あなたのシナリオは、私が思うストア・プロシージャーではより意味があります。しかし、それはScope_Identiyと同じように動作するので、私はそれをソリューションとしてマークしますが、私はそれを使用しません;-) – Pascal

+0

私の例では、IDを変数に入れません! 「実例」コードは変数表を作成するので、行を挿入してIDを生成する場所があります。 'OUTPUT INSERTED.YourIdentity'は、挿入されたID値を含む結果セットを生成するためにINSERTステートメントを生成します。このソリューションでは、単一のINSERTを使用してデータを挿入し、ID値を選択します。コメント内のあなたのソリューションは、同じことを達成するために2つのコマンドを使用します。挿入時にOUTPUTを使用すると、 '; Scope_Identity();'コードを削除することができます。 –

+0

テーブルに挿入トリガーがある場合は、これがエラーになります。次に 'OUTPUT'の代わりに' OUTPUT INTO'を使う必要があります。 –

11

IDENT_CURRENTが任意セッションおよび任意の範囲内の特定のテーブルに対して生成された最後のID値を返します。

@@IDENTITYは、現在のセッション内の任意のテーブルに対して生成された最後のID値をすべてのスコープにわたって返します。

SCOPE_IDENTITYは、現在のセッション内のテーブルと現在のスコープで生成された最後のID値を返します。

関連する問題