Article ID: 163446 - Last Review: February 22, 2005 - Revision: 3.2 PRB: Guarantee @@IDENTITY Value on a Per Table BasisThis article was previously published under Q163446 On This PageSYMPTOMS
SQL Server documents and treats the @@IDENTITY variable as a global
variable. The following is an excerpt from the SQL Server Books Online:
To get the last identity value, use the @@IDENTITY global variable. This
variable is accurate after an insert into a table with an identity
column; however, this value is reset after an insert into a table
without an identity column occurs.
Improperly relying on this behavior may quickly cause changes in your application. For example, suppose you do an insert into a table and then check the @@IDENTITY value to do foreign key (FK) inserts. The administrator then adds an insert trigger to the table to perform an insert into the audit table. Now the @@IDENTITY value has been altered, and is no longer the proper @@IDENTITY for FK inserts. This problem may compound itself when you start adding nested triggers or stored procedures. WORKAROUND
There is no way to implement a solid workaround without making code
changes. However, you can employ one of following two strategies:
Method OneUse the method documented in the SQL Server 4.21a Transact-SQL Guide to implement a counter or identity column.To use this method of "Using a Sequence Number Table," see page 165 of the SQL Server 4.21a Transact-SQL Guide. The following is an excerpt from that guide:
Here you use a separate table to maintain the highest sequence number.
This approach ensures that sequence numbers are assigned in sequential
order, without any holds, by effectively single-threading inserts.
Here is an example of implementing your own counter column to maintain the highest sequence number:
Method TwoDesign your own series of procedures and triggers to maintain the @@IDENTITY variable. The basic design is to create a temporary table before you begin working in the database. Then, for every table that contains an identity column, add an INSERT trigger that places the @@IDENTITY value in your temporary table. This value is then retrieved later by selecting back the proper value. If you are using transactions, be aware of their ramifications on the temporary table inserts.Note: The SQL Server 7.0 feature allowing multiple triggers on the same object requires that proper logic be built into all INSERT triggers bound to the given object. There is no trigger precedence ordering and as such the developer must account for the logic in any ordering. The following script shows how to retain the last @@IDENTITY value assigned to a specific table: | Article Translations
|
Back to the top
