適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
@@IDENTITY 是一個系統函數,回傳最後插入的單位值。
Transact-SQL 語法慣例 (部分機器翻譯)
語法
@@IDENTITY
傳回類型
numeric(38,0)
備註
完成 INSERT一個 、 SELECT INTO或 批量複製語句後,包含 @@IDENTITY 該語句產生的最後一個身份值。
- 若該陳述不影響任何具有單位欄位的資料表,
@@IDENTITY則回傳NULL。 - 若插入多列,產生多個身份值,則
@@IDENTITY回傳最後產生的身份值。 - 如果該陳述式觸發一個或多個觸發器執行產生身份值的插入,則在陳述句結束後立即呼叫
@@IDENTITY,會回傳觸發器產生的最後一個身份值。 - 如果觸發器在插入動作後觸發,該資料表有身份欄位,且該觸發器插入到另一個沒有身份欄位的資料表,
@@IDENTITY則會回傳第一個插入的身份值。@@IDENTITY若INSERTORSELECT INTO語句或批量複製失敗,或交易被回滾,該值不會回復到先前設定。
失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別欄位值中的間距。 識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。 例如,若 INSERT 敘述因 IGNORE_DUP_KEY 違規而失敗,該表格的當前身份值仍會遞增。
@@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。 如需詳細資訊,請參閱 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