首頁 >資料庫 >mysql教程 >SQL Server 中的「@@IDENTITY」、「SCOPE_IDENTITY()」、「IDENT_CURRENT()」和「IDENTITY()」之間有什麼不同?

SQL Server 中的「@@IDENTITY」、「SCOPE_IDENTITY()」、「IDENT_CURRENT()」和「IDENTITY()」之間有什麼不同?

Linda Hamilton
Linda Hamilton原創
2025-01-20 12:42:11545瀏覽

What are the Differences Between `@@IDENTITY`, `SCOPE_IDENTITY()`, `IDENT_CURRENT()`, and `IDENTITY()` in SQL Server?

深入理解SQL Server中的@@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT()IDENTITY()函數

在SQL資料庫程式設計中,取得最後插入的識別值是一項關鍵任務。為此,提供了多種函數,每個函數都有其細微差別。 SCOPE_IDENTITY()IDENTITY()@@IDENTITYIDENT_CURRENT()是最常用的幾個函數,但它們之間的區別可能令人困惑。

理解作用域

理解「作用域」的概念是理解這些函數之間差異的關鍵。在SQL中,作用域指的是查詢或程式碼區塊執行的層級。存在兩個主要作用域:

  • 會話作用域:單一資料庫連線的上下文。
  • 查詢作用域:單一查詢或預存程序的上下文。

函數差

基於作用域和功能,以下是每個函數的細分:

  • @@IDENTITY傳回在同一會話中建立的最後一個識別值。此函數不依賴查詢或預存程序的作用域,通常用於全域標識值的檢索。
  • SCOPE_IDENTITY()傳回在同一會話和作用域中建立的最後一個識別值。與@@IDENTITY不同,此函數只考慮目前查詢或預存程序的上下文。
  • IDENT_CURRENT(name)傳回為特定資料表或檢視所建立的最後一個識別值,而不管會話或查詢作用域為何。此函數可用於檢索不同查詢和會話中的標識值。
  • IDENTITY()與其他三個函數不同,IDENTITY()主要用於在SELECT...INTO查詢中產生識別值。它不會檢索現有的標識值。

使用場景

為了說明這些差異,請考慮以下場景:

  • 範例1:插入具有識別列的記錄並使用@@IDENTITY檢索它。
<code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity;
PRINT @Identity;  -- 打印全局插入的标识值</code>
  • 範例2: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>

在這些場景中,@@IDENTITYSCOPE_IDENTITY()由於觸發器的參與而表現出不同的行為。

最佳實務建議

在大多數情況下,SCOPE_IDENTITY()是檢索建立的最後一個識別值的建議函數。它在當前查詢或預存程序中提供最可靠和上下文相關的數值。但是,如果您需要檢索不同作用域或會話中的識別值,IDENT_CURRENT(name)提供了該功能。

以上是SQL Server 中的「@@IDENTITY」、「SCOPE_IDENTITY()」、「IDENT_CURRENT()」和「IDENTITY()」之間有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn