El incremento de identidad de la columna de SQL Server 2012 salta de 6 a 1000+ en la séptima entrada [duplicado]

Resuelto Andy Clark asked hace 11 años • 3 respuestas

Tengo un escenario extraño en el que la columna int de identidad automática en mi base de datos de SQL Server 2012 no se incrementa correctamente.

Digamos que tengo una tabla que usa una identidad automática int como clave principal y esporádicamente omite incrementos, por ejemplo:

1, 2, 3, 4, 5, 1004, 1005

Esto sucede en un número aleatorio de tablas en momentos muy aleatorios, no se puede replicar para encontrar tendencias.

¿Cómo está pasando esto? ¿Hay alguna manera de detenerlo?

Andy Clark avatar Jan 05 '13 01:01 Andy Clark
Aceptado

Todo esto es perfectamente normal. Microsoft agregó sequencesen SQL Server 2012, finalmente, podría agregar y cambiar la forma en que se generan las claves de identidad. Eche un vistazo aquí para obtener alguna explicación.

Si desea tener el comportamiento anterior, puede:

  1. utilice el indicador de seguimiento 272: esto provocará que se genere un registro para cada valor de identidad generado. El rendimiento de la generación de identidades puede verse afectado al activar este indicador de seguimiento.
  2. use un generador de secuencia con la configuración SIN CACHE ( http://msdn.microsoft.com/en-us/library/ff878091.aspx )
Mithrandir avatar Jan 04 '2013 18:01 Mithrandir

Tuve el mismo problema, encontré el siguiente informe de error en SQL Server 2012. Si aún es relevante, consulte las condiciones que causan el problema; también existen algunas soluciones (aunque no lo intenté). La conmutación por error o el reinicio dan como resultado el restablecimiento de la identidad

yoosha avatar Jan 23 '2014 13:01 yoosha

Si bien el indicador de seguimiento 272 puede funcionar para muchos, definitivamente no funcionará para instalaciones alojadas de Sql Server Express. Entonces, creé una tabla de identidad y la uso a través de un disparador EN LUGAR DE. Espero que esto ayude a alguien más y/o les brinde a otros la oportunidad de mejorar mi solución. La última línea permite devolver la última columna de identidad agregada. Como normalmente uso esto para agregar una sola fila, esto funciona para devolver la identidad de una sola fila insertada.

La tabla de identidad:

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]

y el disparador de inserción:

-- INSERT --
IF OBJECT_ID ('dbo.trgtblsysTrackerMessagesIdentity', 'TR') IS NOT NULL
   DROP TRIGGER dbo.trgtblsysTrackerMessagesIdentity;
GO
CREATE TRIGGER trgtblsysTrackerMessagesIdentity
ON dbo.tblsysTrackerMessages
INSTEAD 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
MicrosoftAccessPros.com avatar May 04 '2015 13:05 MicrosoftAccessPros.com