Insertando filas en otra tabla mientras se preserva la IDENTIDAD


3

Estoy realizando la lógica ETL en una tabla de SQL Server.Voy a sincronizar los datos de una tabla a otra.Para todos los registros que se deben agregar a la tabla de destino en función de la tabla de origen, estoy haciendo una inserción en esas filas en la tabla de destino.El esquema define una de las columnas como una columna de identidad.Por lo tanto, SQL Server incrementa automáticamente la identificación de las nuevas filas que se insertan.Debido a que estoy moviendo los identificadores existentes, necesito eliminar la identidad, insertar esas filas, volver a aplicar la identidad y luego restablecer la semilla para que coincida con la tabla de origen.¿Cómo puede hacerse esto programáticamente?

  1. ¿Puedo eliminar la declaración de identidad de una columna existente?
  2. ¿Puedo marcar una columna existente como una identidad?
  3. ¿Cómo puedo restablecer la semilla para una columna de identidad?
13

Si bien no evita automáticamente los duplicados, puede deshabilitar la identidad temporalmente utilizando lo siguiente, y es probable que solo desee establecer la semilla de identidad en el valor más alto de la tabla:

 SET IDENTITY_INSERT dbo.tablename ON;

    INSERT ...

    SET IDENTITY_INSERT dbo.tablename OFF;

    DECLARE @sql NVARCHAR(MAX);

    SELECT @sql = N'DBCC CHECKIDENT(''dbo.tablename'', RESEED, '
     + RTRIM(MAX(id_column_name)) + ');' FROM dbo.tablename;

    EXEC sp_executesql @sql;

No estoy seguro de cuál sería su mejor curso de acción para corregir los duplicados.Si inserta 1000 filas nuevas después de la reinicialización, es probable que el sistema de origen genere nuevos valores de identidad que entren en conflicto.Lo que podría considerar hacer es simplemente configurar uno de los valores de identidad para generar números muy por encima del rango al que la otra tabla nunca llegará (por ejemplo, 1.000 millones).Aún puede usar IDENTITY_INSERT para fusionar, pero nunca habrá un conflicto.Esto también hace que sea muy fácil determinar si una fila se generó localmente o se importó.


2

Después de una prueba rápida, pero no pude alterar una columna para eliminar la propiedad de identidad.Asumí que esto funcionaría, pero no parece ser el caso.

ALTER TABLE dbo.FOO 
ALTER COLUMN myId int;

No puede agregar una propiedad de identidad a una columna existente.En SQL Server 2012, puede usar un objeto SEQUENCE para efectuar el mismo comportamiento pero no será una identidad

-- does not work
ALTER TABLE dbo.FOO 
ALTER COLUMN myId int identity(1,1);

Para restablecer el valor de identidad, estará interesado en DBCC CHECKIDENT con RESEED

DBCC CHECKIDENT ("dbo.FOO", RESEED, 123456);

Dicho todo esto, no tiene que eliminar la propiedad de identidad en absoluto en su escenario.Simplemente configure el IDENTITY_INSERT en la tabla de destino, cargue los datos y cuando termine, IDENTITY_INSERT a IDENTITY_INSERT para que coincida con su tabla de origen.


0

¿Realmente necesitas unir la identificación de la tabla que estás fusionando después de la carga?¿O solo lo necesita para que los registros de niños estén correctamente relacionados?Si solo se usa para relacionar adecuadamente los tbales de los niños, este es un proceso que hemos usado en ocasiones:

Organice todos los datos en tablas de trabajo. Agregue una columna para el ID de la otra tabla a la tabla en la que está cargando.

Permita que el proceso cree nuevos registros con identidades para la tabla principal.

Actualice la tabla secundaria por etapas para usar la nueva identificación uniéndose a la columna que agregó.

Haga que el proceso cargue las tablas secundarias.

  0

Sí, me gustaría mantener los IDs iguales.Este es un despliegue, por lo que no me gusta tener discrepancias (si es posible) 14 ene. 132013-01-14 23:11:44