usar una ultimo tabla scope_identity registro recuperar que obtener insertado generar como automatico sql sql-server identity

sql - una - ¿Cómo puedo recuperar las identidades de las filas que se insertaron a través de la inserción... seleccionar?



recuperar id insertado sql server (4)

@@ IDENTITY te devolverá el último valor de IDENTIDAD insertado, por lo que tienes dos posibles problemas

  1. Tenga cuidado con los desencadenantes ejecutados al insertar en table_xyz, ya que esto puede cambiar el valor de @@ IDENTITY.

  2. ¿Tiene tbl_abc más de una fila? Si es así, @@ IDENTITY solo devolverá el valor de identidad de la última fila

El problema 1 se puede resolver usando SCOPE__IDENTITY () en lugar de @@ IDENTITY El Issue 2 es más difícil de resolver. ¿Campo1 en tbl_abc define un registro único dentro de tbl_xyz, si es así, puede volver a seleccionar los datos de table_xyz con la columna de identidad. Hay otras soluciones usando CURSORS, pero estas serán lentas.

Estoy insertando registros a través de una consulta similar a esta:

insert into tbl_xyz select field1 from tbl_abc

Ahora me gustaría recuperar los valores de IDENTIDAD recién generados de los registros insertados. ¿Cómo hago esto con la cantidad mínima de bloqueo y la máxima fiabilidad?


Por lo que sé, no se puede hacer esto con SQL directo en el mismo script. Pero podrías crear un disparador INSERTAR. Ahora, odio los desencadenantes, pero es una forma de hacerlo.

Dependiendo de lo que intente hacer, es posible que desee insertar primero las filas en una tabla temporal o una variable de tabla, y tratar el conjunto de resultados de esa manera. Afortunadamente, hay una columna única a la que puedes vincular.

También puede bloquear la tabla, obtener la clave máxima, insertar las filas, y luego obtener su clave máxima de nuevo y hacer un rango.

Desencadenar:

--Use the Inserted table. This conaints all of the inserted rows. SELECT * FROM Inserted

Tabla de temperatura:

insert field1, unique_col into #temp from tbl_abc insert into tbl_xyz (field1, unique_col) select field1, unique_col from tbl_abc --This could be an update, or a cursor, or whatever you want to do SELECT * FROM tbl_xyz WHERE EXISTS (SELECT top 1 unique_col FROM #temp WHERE unique_col = tbl_xyz.unique_col)

Rango clave:

Declare @minkey as int, @maxkey as int BEGIN TRANS --You have to lock the table for this to work --key is the name of your identity column SELECT @minkey = MAX(key) FROM tbl_xyz insert into tbl_xyz select field1 from tbl_abc SELECT @maxkey = MAX(key) FROM tbl_xyz COMMIT Trans SELECT * FROM tbl_xyz WHERE key BETWEEN @minkey and @maxkey


Puede obtener esta información usando la cláusula OUTPUT .

Puede generar su información en una tabla o vista de objetivos temporales.

Aquí hay un ejemplo:

DECLARE @InsertedIDs TABLE (ID bigint) INSERT into DestTable (col1, col2, col3, col4) OUTPUT INSERTED.ID INTO @InsertedIDs SELECT col1, col2, col3, col4 FROM SourceTable

A continuación, puede consultar la tabla InsertedIDs para sus ID insertadas.