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

SQL Server 中的「SCOPE_IDENTITY()」、「IDENTITY()」、「@@IDENTITY」和「IDENT_CURRENT()」有何不同?

DDD
DDD原創
2025-01-20 12:46:09422瀏覽

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

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

SCOPE_IDENTITY()IDENTITY()@@IDENTITYIDENT_CURRENT()這四個函數在SQL Server中都用來擷取自增列值,但各自用途不同。讓我們深入探討它們的差異。

SCOPE_IDENTITY()

SCOPE_IDENTITY()擷取目前作用域內最後插入的自增列值,此作用域可以是目前語句或批次。它不考慮同一會話中其他作用域內產生的自增列值。

IDENTITY()

與名稱相反,IDENTITY()不用於擷取自增列值。它用於SELECT...INTO語句,在從另一個表的資料派生新表時建立自增列。

@@IDENTITY

@@IDENTITY擷取目前會話中最後插入的自增列值,無論其作用域為何。這意味著它包括在目前作用域和同一會話期間其他作用域中產生的自增列值。

IDENT_CURRENT()

IDENT_CURRENT()是一個較少使用的函數,專門用於檢索特定表或視圖中最後插入的自增列值,即使跨會話也是如此。

何時使用每個函數?

通常,SCOPE_IDENTITY()是首選,因為它提供目前作用域內的隔離性。如果您需要引用同一作用域內父語句或預存程序中產生的自增列值,SCOPE_IDENTITY()可確保其準確性。

@@IDENTITY在存取會話中其他作用域內產生的自增列值時很有用。例如,當同一會話中發生多個操作時,您可以在觸發器或批次作業中使用它。

IDENT_CURRENT()主要用於需要跨多個會話存取特定表中的自增列值的場景,例如連接來自不同資料來源的資料時。

範例:

考慮以下程式碼片段:

<code class="language-sql">-- 向'Customers'表插入一条记录
INSERT INTO Customers (Name) VALUES ('John Doe');

-- 检索当前语句中生成的自增列值
SELECT SCOPE_IDENTITY();

-- 触发器触发并插入另一条记录
CREATE TRIGGER InsertAudit ON Customers
AFTER INSERT
AS
    INSERT INTO AuditLog (CustomerId, Action)
    VALUES (@@IDENTITY, 'INSERT');

-- 检索触发器生成的自增列值
SELECT @@IDENTITY;</code>

在此範例中,SCOPE_IDENTITY()將傳回插入至「Customers」表的記錄的自增列值,而@@IDENTITY將傳回插入稽核日誌條目後觸發器所建立的自增列值。這展示了不同的作用域如何導致使用@@IDENTITY的結果不同。

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

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