|  | Posted by Hugo Kornelis on 11/28/06 20:24 
On Tue, 28 Nov 2006 16:16:00 +0100, Robert Klemme wrote:
 (snip)
 >If for some other reasons you really need the value beforehand, you can
 >emulate an Oracle sequence
 >
 >-- test script
 >create table counter (
 >   cnt int identity(1,1) primary key clustered
 >)
 >
 >insert into counter default values
 >print 'ident: ' + cast(scope_identity() as varchar)
 >-- optional: truncate table counter
 (snip)
 
 Hi Robert,
 
 I don't hink the optional TRUNCATE is a good idea, since TRUNCATE also
 resets the identity seed :-)
 
 If you don't want to fill up the table, here's a different suggestion
 (blatantly stolen from Itzik Ben-Gan's excellent book):
 
 BEGIN TRAN;
 SAVE TRAN S1;
 INSERT INTO counter DEFAULT VALUES;
 SET @ident = SCOPE_IDENTITY();
 ROLLBACK TRAN S1;
 COMMIT TRAN;
 
 The BEGIN TRAN and COMMIT TRAN are necessary for the SAVE TRAN and the
 ROLLBACK with named savepoint to work. If you're already in a
 transaction, the BEGIN TRAN will increase the tran counter and the
 COMMIT TRAN will decrease it again. And the SAVE TRAN S1 / ROLLBACK TRAN
 S1 combo ensures that the insert is undone (but the increment to the
 identity seed and the variable assignment are left intact).
 
 --
 Hugo Kornelis, SQL Server MVP
  Navigation: [Reply to this message] |