Identity
columns, also
known as AUTO
INCREMENT
column, is the column whose value is auto incremented by SQL Server
on each insert. Data insertion in an IDENTITY column is automatic
(not manual - we
do not insert any data manually in the identity column,
the data
is inserted for that IDENTITY column automatically by SQL Server,
depending upon the Identity Increment value).
When
we need to retrieve the latest inserted row information through SQL
Query, we can use SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY
functions. All three functions return the last-generated identity
values, however, these functions differ on the scope and session on
which last
is defined.
@@IDENTITY
– It returns the last identity value generated for any table in
the current session,
across all scopes. @@IDENTITY is not limited to a specific scope.
Ex:
Suppose we create an insert
trigger on table which
inserts a row in another table which generates an identity column.
Then @@IDENTITY
returns that identity
record which is created by trigger.
SCOPE_IDENTITY
– It returns the last identity value generated for any
table in the current session and the current scope.
Ex:
Suppose we create an insert trigger on table which inserts a row in
another table which generates an identity column, then
SCOPE_IDENTITY
result is not affected
but if a trigger or a user defined function is affected on the same
table that produced the value returns that identity record then
SCOPE_IDENTITY
returns that identity
record which is created by trigger or a user defined function.
IDENT_CURRENT
– It returns the last identity value generated for a specific
table in any session and any scope. It is not affected by scope and
session and only depends on a particular table. IDENT_CURRENT
returns the identity value for a specific table in any session or
any scope.
Example:
Lets assume that there are two tables, X and Y and both have identity
columns. Define an INSERT trigger on X. When a row is inserted to X,
the trigger fires and inserts a new row in Y. We can identify two
scopes here:
INSERT
on X
INSERT
on Y by the trigger
@@IDENTITY
and SCOPE_IDENTITY will return different values at the end of an
INSERT statement on X. @@IDENTITY will return the last
identity column value inserted across any scope in the current
session. So, this is the
value inserted in Y.
SCOPE_IDENTITY()
will return the IDENTITY value inserted in X. This was the last
insert that occurred in the same scope. The SCOPE_IDENTITY() function
will return null value if the function is invoked before any INSERT
statements into an identity column occur in the scope.
Note:
Failed
statements and transactions can change the current identity for a
table and create gaps in the identity column values.
The
identity value is never rolled back even though the transaction that
tried to insert the value into the table is not committed. For
example, if an INSERT statement fails because of an IGNORE_DUP_KEY
violation, the current identity value for the table is still
incremented.
Example:
CREATE
TABLE X(id
int
IDENTITY);
CREATE
TABLE Y(id
int
IDENTITY(100,1));
GO
CREATE
TRIGGER
XIns ON
X FOR
INSERT
AS
BEGIN
INSERT
Y DEFAULT
VALUES
END;
GO
--End
of trigger definition
SELECT
id FROM
X;
--id
is empty
SELECT
id FROM
Y;
--ID
is empty
--Do
the following in Session 1
INSERT
X DEFAULT
VALUES;
SELECT
@@IDENTITY;
/*Returns
the value 100. This was inserted by the trigger.*/
SELECT
SCOPE_IDENTITY();
/*
Returns the value 1. This was inserted by the
INSERT
statement - INSERT X DEFAULT VALUES;*/
SELECT
IDENT_CURRENT('Y');
/*
Returns value inserted into Y, that is in the trigger.*/
SELECT
IDENT_CURRENT('X');
/*
Returns value inserted into X.
This
was the INSERT statement - INSERT X DEFAULT VALUES;*/
--
Do the following in Session 2.
SELECT
@@IDENTITY;
/*
Returns NULL because there has been no INSERT action
up
to this point in this session.*/
SELECT
SCOPE_IDENTITY();
/*
Returns NULL because there has been no INSERT action
up
to this point in this scope in this session.*/
SELECT
IDENT_CURRENT('Y');
/*
Returns the last value inserted into Y.*/