¿Cómo uso la cláusula OUTPUT de una instrucción INSERT para obtener el valor de identidad?


240

Si tengo una declaración de inserción como:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

¿Cómo configuro @var INTel valor de identidad de la nueva fila (llamado Id) usando la cláusula OUTPUT? He visto ejemplos de poner INSERTED.Name en variables de tabla, por ejemplo, pero no puedo incluirlo en una variable que no sea de tabla.

Lo he intentado OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Idpero ninguno ha funcionado.


3
Ya sé sobre @@ SCOPE_IDENTITY, específicamente quiero saber cómo hacerlo con OUPUT. Gracias.
Yatrix

66
Debe insertarlo en una variable de tabla y luego seleccionarlo. No hay sintaxis para asignar directamente a una variable escalar de la OUTPUTcláusula.
Martin Smith

3
La cláusula OUTPUT tiene a la salida en una variable de tabla o mesa ..
mellamokb

55
La OUTPUTcláusula escribe en una mesa. Puede ser una tabla variable, una tabla temporal, ....
HABO

2
Mi pregunta específicamente pide la cláusula OUTPUT.
Yatrix

Respuestas:


464

Puede hacer que la ID recién insertada se envíe a la consola SSMS de esta manera:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

También puede usar esto desde, por ejemplo, C #, cuando necesite devolver la ID a su aplicación de llamada, simplemente ejecute la consulta SQL con .ExecuteScalar() (en lugar de .ExecuteNonQuery()) para leer la IDrespuesta resultante .

O si necesita capturar el recién insertado ID T-SQL (por ejemplo, para un procesamiento posterior), debe crear una variable de tabla:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

De esta manera, puede poner múltiples valores @OutputTbly procesarlos más. También puede usar una tabla temporal "regular" ( #temp) o incluso una tabla persistente "real" como su "objetivo de salida" aquí.


2
La respuesta aquí para el código detrás fue concisa. ExecuteScalar () FTW
Joe Johnston

10
Puede insertar el resultado en un real persistent table- esto es extremadamente fantástico porque significa que puede INSERTobtener información en TWOtablas al mismo tiempo.
gotqn

77
Nunca use @@ IDENTITY para tirar desde la parte superior. Trabaje con los disparadores de manera difícil, ya que estaban registrando el historial de cambios realizados en una tabla e insertándolos en una nueva tabla al mismo tiempo @@ IDENTITY comenzó a devolver valores de la tabla de historial. hilaridad se produce a partir de ahí! Utilice la solución de marc_s. Por el momento, utilicé el método @OutputTbl, pero las otras opciones me intrigan.
Eric Bishard

44
OUTPUT INTO es extremadamente fantástico, excepto que "la tabla de destino de la cláusula OUTPUT INTO no puede estar en ninguno de los lados de una relación (clave principal, clave externa)", que para mí representa aproximadamente el 99% de los casos de uso potencial. Supongo que esto se debe a que la cláusula OUTPUT puede devolver datos incluso cuando la transacción se revierte, pero es un poco molesto que es tan difícil insertarlos en las tablas A y B relacionadas de una sola vez.
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()funciona mejor para eso.
Derreck Dean el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.