SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY

以下微软docs上的解释,返回最后插入的identity字段值

1. @@IDENTITY:

在 INSERT、SELECT INTO 或大量複製陳述式完成之後,@@IDENTITY 會包含陳述式所產生的最後一個識別值。 如果陳述式並未影響任何含有識別欄位的資料表,@@IDENTITY 會傳回 NULL。 如果插入多個資料列,產生多個識別值,@@IDENTITY 會傳回最後一個產生的識別值。 如果陳述式引發一或多個執行插入來產生識別值的觸發程序,在陳述式之後緊接著呼叫 @@IDENTITY,會傳回觸發程序所產生的最後一個識別值。 如果在含有識別欄位之資料表的插入動作之後引發觸發程序,且觸發程序插入另一個沒有識別欄位的資料表,@@IDENTITY 會傳回第一次插入的識別值。 如果 INSERT 或 SELECT INTO 陳述式或大量複製失敗,或回復交易,@@IDENTITY 值不會還原成先前的設定。
失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別欄位值中的間距。 識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。 例如,如果 INSERT 陳述式因 IGNORE_DUP_KEY 違規而失敗,資料表的目前識別值仍會遞增。

2. @@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是類似的函式,因為它們都會傳回最後插入資料表之 IDENTITY 資料行的值。

@@IDENTITY 和 SCOPE_IDENTITY 會傳回目前工作階段任何資料表中所產生的最後一個識別值。 不過,SCOPE_IDENTITY 只會傳回目前範圍內的值;@@IDENTITY 不限於特定範圍。

IDENT_CURRENT 不受範圍和工作階段的限制;它只限於指定的資料表。
IDENT_CURRENT 會傳回在任何工作階段和任何範圍中,產生給特定資料表的識別值。 如需詳細資訊,請參閱 IDENT_CURRENT (Transact-SQL)。

@@IDENTITY 函式的範圍是執行它的本機伺服器的目前工作階段。 這個函數不適用於遠端或連結伺服器。 若要取得不同伺服器的識別值,請在該遠端或連結伺服器上執行預存程序,讓這個預存程序 (在遠端或連結伺服器的內容中執行) 收集識別值,並將它傳回本機伺服器發出呼叫的連接。
複寫可能會影響 @@IDENTITY 值,因為此值會用於複寫觸發程序和預存程序中。 如果資料行屬於複寫發行項的一部分,@@IDENTITY 就不是最近使用者建立之識別的可靠指標。 您可以使用 SCOPE_IDENTITY() 函式語法來取代 @@IDENTITY。

另可參考:

  • The @@identity function returns the last identity created in the same
  • session(connection). The scope_identity() function returns the last
    identity created in the same session and the same scope.
  • The ident_current(name) returns the last identity created for a
  • specific table or view in any session. The identity() function
    is not used to get an identity, it’s used to create an identity in
    a select…into query.

The session is the database connection.
The scope is the current query or the current stored procedure.

A situation where the scope_identity() and the @@identity functions differ, is if you have a trigger on the table. If you have a query that inserts a record, causing the trigger to insert another record somewhere, the scope_identity() function will return the identity created by the query, while the @@identity function will return the identity created by the trigger.
So, normally you would use the scope_identity() function.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值