ultimo - poner identity sql server
¿Cómo insertar múltiples registros y obtener el valor de identidad? (7)
Estoy insertando varios registros en una tabla A de otra tabla B. ¿Hay alguna forma de obtener el valor de identidad de la tabla A y actualizar la tabla b sin tener que hacer un cursor?
Create Table A
(id int identity,
Fname nvarchar(50),
Lname nvarchar(50))
Create Table B
(Fname nvarchar(50),
Lname nvarchar(50),
NewId int)
Insert into A(fname, lname)
SELECT fname, lname
FROM B
Estoy usando MS SQL Server 2005.
Leyendo cuidadosamente su pregunta, solo desea actualizar la tabla B en función de los nuevos valores de identidad en la tabla A.
Una vez que finaliza la inserción, solo ejecuta una actualización ...
UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
ON (B.FName = A.Fname AND B.LName = A.LName)
Esto supone que la combinación FName / LName se puede usar para hacer coincidir las claves de los registros entre las tablas. Si no es el caso, es posible que deba agregar campos adicionales para garantizar que los registros coincidan correctamente.
Si no tiene una clave alternativa que le permita hacer coincidir los registros, entonces no tiene ningún sentido, ya que los registros en la tabla B no pueden distinguirse entre sí.
MBelly tiene razón con el dinero, pero entonces el activador siempre intentará actualizar la tabla B incluso si no es necesario (¿porque también está insertando desde la tabla C?).
Darren también es correcto aquí, no se pueden obtener múltiples identidades como resultado. Sus opciones están usando un cursor y tomando la identidad de cada fila que inserta, o utilizando el enfoque de Darren de almacenar la identidad antes y después. Siempre que sepa el incremento de la identidad, esto debería funcionar, siempre y cuando se asegure de que la tabla esté bloqueada para los tres eventos.
Si fuera yo, y no era crítico en el tiempo, iría con un cursor.
Por lo que yo entiendo, el problema que está teniendo es que quiere INSERTAR en la Tabla A, que tiene una columna de identidad, y desea conservar la identidad de la Tabla B que no lo hace.
Para hacerlo, solo debe activar la inserción de identidad en la tabla A. Esto le permitirá definir sus identificaciones en la inserción y, siempre que no entren en conflicto, debería estar bien. Entonces puedes hacer:
Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B
No estoy seguro de qué base de datos está utilizando, pero para el servidor sql, el comando para activar la inserción de identidad sería:
set identity_insert A on
Puede obtener el uniéndose en el número de fila . Esto es posible porque, como se trata de una identidad, aumentará a medida que agregue elementos, que estarán en el orden en que los está seleccionando.
Si siempre quiere este comportamiento, podría colocar un desencadenador DESPUÉS DE INSERTAR en la Tabla A que actualizará la tabla B.
Sugiero usar el tipo uniqueidentifier en lugar de la identidad. En este caso, puede generar ID antes de la inserción:
update B set NewID = NEWID()
insert into A(fname,lname,id) select fname,lname,NewID from B
Use la cláusula de salida del 2005:
DECLARE @output TABLE (id int)
Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B
select * from @output
ahora su variable de tabla tiene los valores de identidad de todas las filas que inserta.