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
Tenga cuidado con los desencadenantes ejecutados al insertar en table_xyz, ya que esto puede cambiar el valor de @@ IDENTITY.
¿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.
SELECT @@IDENTITY
Así es como lo he hecho antes. Sin embargo, no estoy seguro de si esto satisfará la segunda mitad de su publicación.
EDITAR
Encontré este enlace también, pero no estoy seguro de si es el mismo ...
¿Cómo insertar múltiples registros y obtener el valor de identidad?