64

挿入後に主キー ID フィールドの値を取得するときに使用されるさまざまな方法を見てきました。

declare @t table (
    id int identity primary key,
    somecol datetime default getdate()
)
insert into @t
default values

select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1

挿入後に ID のテーブルを返す:

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values   

どの方法が適切またはより良いですか?OUTPUT メソッドはスコープセーフですか?

2 番目のコード スニペットは、 SQL in the Wildから借用したものです。

4

8 に答える 8

76

It depends on what you are trying to do...

@@IDENTITY

Returns the last IDENTITY value produced on a connection, regardless of the table that produced the value, and regardless of the scope of the statement that produced the value. @@IDENTITY will return the last identity value entered into a table in your current session. @@IDENTITY is limited to the current session and is not limited to the current scope. For example, if you have a trigger on a table that causes an identity to be created in another table, you will get the identity that was created last, even if it was the trigger that created it.

SCOPE_IDENTITY()

Returns the last IDENTITY value produced on a connection and by a statement in the same scope, regardless of the table that produced the value. SCOPE_IDENTITY() is similar to @@IDENTITY, but it will also limit the value to your current scope. In other words, it will return the last identity value that you explicitly created, rather than any identity that was created by a trigger or a user defined function.

IDENT_CURRENT()

Returns the last IDENTITY value produced in a table, regardless of the connection and scope of the statement that produced the value. IDENT_CURRENT is limited to a specified table, but not by connection or scope.

于 2009-01-26T21:28:17.307 に答える
15

にバグがあることに注意してください-MSConnectscope_identity()@@identity参照してください:https ://web.archive.org/web/20130412223343/https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes -戻り値-不正な値

引用(Microsoftから):

すべての場合OUTPUTの代わりに使用することを強くお勧めします。@@IDENTITYこれは、IDとタイムスタンプを読み取るための最良の方法です。

追加するために編集:これは現在修正される可能性があります。Connectでエラーが発生しますが、次を参照してください。

Scope_Identity()が誤った値を返すのを修正しましたか?

于 2009-09-15T14:47:28.070 に答える
6

@@Identity は昔ながらの方法です。今後はすべてのインスタンスで SCOPE_IDENTITY() を使用してください。@@IDENTITY を使用した場合の影響については、MSDNを参照してください (これは悪いことです!)。

于 2009-01-26T21:22:19.767 に答える
4

SCOPE_IDENTITYは単一行には十分であり、何らかの理由で中間TRIGGERの結果を確認する必要がある場合を除いて推奨されます(なぜですか?)。

複数の行の場合、OUTPUT / OUTPUT INTOは新しい親友であり、行を再検索して別のテーブルに挿入する代わりになります。

于 2009-01-26T22:25:58.220 に答える
3

A small correction to Godeke's answer:

It's not just triggers you need to worry about. Any kind of nested operation, such as stored procs, that causes identifiers to be created could change the value of @@IDENTITY.

Another vote for scope_identity...

于 2009-01-26T21:33:09.370 に答える
3

SQL Server 2005 で使用できる別の方法は、SQL in the Wild で概説されています。

これにより、挿入後に複数の ID を取得できます。ブログ投稿のコードは次のとおりです。

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values
于 2009-01-26T21:22:18.270 に答える
1

@@IDENTITY の使用中は注意してください ...

http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/

于 2009-11-02T15:07:41.700 に答える