深入理解SQL Server中的@@IDENTITY
, SCOPE_IDENTITY()
, IDENT_CURRENT()
和IDENTITY()
函數
在SQL資料庫程式設計中,取得最後插入的識別值是一項關鍵任務。為此,提供了多種函數,每個函數都有其細微差別。 SCOPE_IDENTITY()
、IDENTITY()
、@@IDENTITY
和IDENT_CURRENT()
是最常用的幾個函數,但它們之間的區別可能令人困惑。
理解作用域
理解「作用域」的概念是理解這些函數之間差異的關鍵。在SQL中,作用域指的是查詢或程式碼區塊執行的層級。存在兩個主要作用域:
函數差
基於作用域和功能,以下是每個函數的細分:
@@IDENTITY
:傳回在同一會話中建立的最後一個識別值。此函數不依賴查詢或預存程序的作用域,通常用於全域標識值的檢索。 SCOPE_IDENTITY()
:傳回在同一會話和作用域中建立的最後一個識別值。與@@IDENTITY
不同,此函數只考慮目前查詢或預存程序的上下文。 IDENT_CURRENT(name)
:傳回為特定資料表或檢視所建立的最後一個識別值,而不管會話或查詢作用域為何。此函數可用於檢索不同查詢和會話中的標識值。 IDENTITY()
:與其他三個函數不同,IDENTITY()
主要用於在SELECT...INTO
查詢中產生識別值。它不會檢索現有的標識值。 使用場景
為了說明這些差異,請考慮以下場景:
@@IDENTITY
檢索它。 <code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity; PRINT @Identity; -- 打印全局插入的标识值</code>
MyTable
上建立一個觸發器,以在另一個表中插入記錄,並從兩個表中擷取識別值。 <code class="language-sql">CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT AS INSERT INTO OtherTable (Name) VALUES (NEW.Name); INSERT INTO MyTable (Name) VALUES ('Test'); SELECT @@identity AS MyIdentity; -- 打印在MyTable中插入的标识值 SELECT scope_identity() AS TriggerIdentity; -- 打印触发器在OtherTable中插入的标识值</code>
在這些場景中,@@IDENTITY
和SCOPE_IDENTITY()
由於觸發器的參與而表現出不同的行為。
最佳實務建議
在大多數情況下,SCOPE_IDENTITY()
是檢索建立的最後一個識別值的建議函數。它在當前查詢或預存程序中提供最可靠和上下文相關的數值。但是,如果您需要檢索不同作用域或會話中的識別值,IDENT_CURRENT(name)
提供了該功能。
以上是SQL Server 中的「@@IDENTITY」、「SCOPE_IDENTITY()」、「IDENT_CURRENT()」和「IDENTITY()」之間有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!