Blog Post

SCOPE_IDENTITY() or @@IDENTITY

,

I’ve seen quite a lot of usage of both functions in the T-SQL codes. However, their usage sometimes matters. The expectation from @@IDENTITY can sometimes not be the desired.

This post shows why you should use SCOPE_IDENTITY() instead of @@IDENTITY when using it with tables that have triggers.

CREATE DATABASE IdentDB;
GO
USE IdentDB;
GO
CREATE TABLE Contacts(
    ID int IDENTITY(1, 1), FirstName nvarchar(50), LastName nvarchar(50)
);
 
INSERT INTO Contacts(FirstName,LastName)
VALUES ('Igor','Micev');

Select the SCOPE_IDENTITY() AND @@IDENTITY functions’ current values.

SELECT SCOPE_IDENTITY() [SCOPE_IDENTITY], @@IDENTITY [@@IDENTITY]
Output:
SCOPE_IDENTITY @@IDENTITY
-------------- ------------
1               1

The table Contacts doesn’t have a trigger and the values of both the functions are identical.

Create Contacts history table and a trigger on Contacts.

CREATE TABLE Contacts_Hist(
HistID int IDENTITY(1, 1), ID int, 
FirstName nvarchar(50), 
LastName nvarchar(50)
);
 
--Create an insert trigger on Contacts
CREATE TRIGGER TRG_Const_Hist ON dbo.Contacts
FOR INSERT
AS
BEGIN
       SET NOCOUNT ON;
       INSERT INTO dbo.Contacts_Hist( ID, FirstName, LastName )
                 SELECT ID, FirstName, LastName
                 FROM INSERTED;
END;

Insert a new record.

INSERT INTO Contacts(FirstName,LastName)
VALUES ('Branko','Nikolov')

SELECT * FROM Contacts
Output:
ID          FirstName           LastName
----------- ------------------  ---------------
1           Igor                Micev
2           Branko              Nikolov
 
SELECT SCOPE_IDENTITY() [SCOPE_IDENTITY], @@IDENTITY [@@IDENTITY]
Output:
SCOPE_IDENTITY                          @@IDENTITY
------------------                      -----------
2                                       1

Now the values of the functions differ. SCOPE_IDENTITY() returns a value of 2 which is the desired, and @@IDENTITY returns a value of 1 which is not the desired. That’s because of the trigger, and the usage of @@IDENTITY produces a bug in such situations.

Now you know why you should use SCOPE_IDENTITY() in your T-SQL codes.

Original post (opens in new tab)
View comments in original post (opens in new tab)

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating