SQL Server 2012 column identity increment jumping from 6 to 1000+ on 7th entry [duplicate] SQL Server 2012 column identity increment jumping from 6 to 1000+ on 7th entry [duplicate] sql-server sql-server

SQL Server 2012 column identity increment jumping from 6 to 1000+ on 7th entry [duplicate]


This is all perfectly normal. Microsoft added sequences in SQL Server 2012, finally, i might add and changed the way identity keys are generated. Have a look here for some explanation.

If you want to have the old behaviour, you can:

  1. use trace flag 272 - this will cause a log record to be generated for each generated identity value. The performance of identity generation may be impacted by turning on this trace flag.
  2. use a sequence generator with the NO CACHE setting (http://msdn.microsoft.com/en-us/library/ff878091.aspx)


Got the same problem, found the following bug report in SQL Server 2012If still relevant see conditions that cause the issue - there are some workarounds there as well (didn't try though).Failover or Restart Results in Reseed of Identity


While trace flag 272 may work for many, it definitely won't work for hosted Sql Server Express installations. So, I created an identity table, and use this through an INSTEAD OF trigger. I'm hoping this helps someone else, and/or gives others an opportunity to improve my solution. The last line allows returning the last identity column added. Since I typically use this to add a single row, this works to return the identity of a single inserted row.

The identity table:

CREATE TABLE [dbo].[tblsysIdentities]([intTableId] [int] NOT NULL,[intIdentityLast] [int] NOT NULL,[strTable] [varchar](100) NOT NULL,[tsConcurrency] [timestamp] NULL,CONSTRAINT [PK_tblsysIdentities] PRIMARY KEY CLUSTERED (    [intTableId] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

and the insert trigger:

-- INSERT --IF OBJECT_ID ('dbo.trgtblsysTrackerMessagesIdentity', 'TR') IS NOT NULL   DROP TRIGGER dbo.trgtblsysTrackerMessagesIdentity;GOCREATE TRIGGER trgtblsysTrackerMessagesIdentityON dbo.tblsysTrackerMessagesINSTEAD OF INSERT AS BEGIN    DECLARE @intTrackerMessageId INT    DECLARE @intRowCount INT    SET @intRowCount = (SELECT COUNT(*) FROM INSERTED)    SET @intTrackerMessageId = (SELECT intIdentityLast FROM tblsysIdentities WHERE intTableId=1)    UPDATE tblsysIdentities SET intIdentityLast = @intTrackerMessageId + @intRowCount WHERE intTableId=1    INSERT INTO tblsysTrackerMessages(     [intTrackerMessageId],    [intTrackerId],    [strMessage],    [intTrackerMessageTypeId],    [datCreated],    [strCreatedBy])    SELECT @intTrackerMessageId + ROW_NUMBER() OVER (ORDER BY [datCreated]) AS [intTrackerMessageId],     [intTrackerId],   [strMessage],   [intTrackerMessageTypeId],   [datCreated],   [strCreatedBy] FROM INSERTED;   SELECT TOP 1 @intTrackerMessageId + @intRowCount FROM INSERTED;END