共用方式為


@@IDENTITY(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

@@IDENTITY 是一個系統函數,回傳最後插入的單位值。

Transact-SQL 語法慣例 (部分機器翻譯)

語法

@@IDENTITY  

傳回類型

numeric(38,0)

備註

完成 INSERT一個 、 SELECT INTO或 批量複製語句後,包含 @@IDENTITY 該語句產生的最後一個身份值。

  • 若該陳述不影響任何具有單位欄位的資料表, @@IDENTITY 則回傳 NULL
  • 若插入多列,產生多個身份值,則 @@IDENTITY 回傳最後產生的身份值。
  • 如果該陳述式觸發一個或多個觸發器執行產生身份值的插入,則在陳述句結束後立即呼叫 @@IDENTITY ,會回傳觸發器產生的最後一個身份值。
  • 如果觸發器在插入動作後觸發,該資料表有身份欄位,且該觸發器插入到另一個沒有身份欄位的資料表, @@IDENTITY 則會回傳第一個插入的身份值。 @@IDENTITYINSERT OR SELECT INTO 語句或批量複製失敗,或交易被回滾,該值不會回復到先前設定。

失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別欄位值中的間距。 識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。 例如,若 INSERT 敘述因 IGNORE_DUP_KEY 違規而失敗,該表格的當前身份值仍會遞增。

@@IDENTITYSCOPE_IDENTITYIDENT_CURRENT 和 是相似的函數,因為它們都回傳最後插入到 IDENTITY 資料表欄位的值。

  • @@IDENTITYSCOPE_IDENTITY 回傳當前會話任一資料表中產生的最後一個身份值。 然而,僅 SCOPE_IDENTITY 回傳目前範圍內的值; @@IDENTITY 不限於特定範圍。

  • IDENT_CURRENT 不受範圍與會期限制;它限制在指定的表格上。 IDENT_CURRENT 回傳在任何會話及任何作用域中,為特定資料表產生的身份值。 如需詳細資訊,請參閱 IDENT_CURRENT (Transact-SQL)

@@IDENTITY 式的作用域為執行本機伺服器的當前會話。 這個函數不適用於遠端或連結伺服器。 若要取得不同伺服器的識別值,請在該遠端或連結伺服器上執行預存程序,讓這個預存程序 (在遠端或連結伺服器的內容中執行) 收集識別值,並將它傳回本機伺服器發出呼叫的連接。

複製會影響該值, @@IDENTITY 因為它被用於複製觸發器和儲存程序中。 @@IDENTITY 若該欄位屬於複製條目,則無法可靠反映最新使用者建立的身份。 你可以用函 SCOPE_IDENTITY() 式語法代替 @@IDENTITY。 如需詳細資訊,請參閱 SCOPE_IDENTITY (Transact-SQL)

注意

呼叫的預存程序或 Transact-SQL 陳述式必須重寫,才能使用 SCOPE_IDENTITY() 函數,此函數會傳回在該使用者陳述式範圍內使用的最新身分識別,而非複寫所用之巢狀觸發程序範圍內的身分識別。

範例

下列範例會將資料列插入含有識別欄位 (LocationID) 的資料表,並利用 @@IDENTITY 來顯示新資料列所用的識別值。

USE AdventureWorks2022;  
GO  
--Display the value of LocationID in the last row in the table.  
SELECT MAX(LocationID) FROM Production.Location;  
GO  
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)  
VALUES ('Damaged Goods', 5, 2.5, GETDATE());  
GO  
SELECT @@IDENTITY AS 'Identity';  
GO  
--Display the value of LocationID of the newly inserted row.  
SELECT MAX(LocationID) FROM Production.Location;  
GO