2012-06-12 15 views
163

Si tengo una instrucción de inserción, tales como:¿Cómo uso una cláusula OUTPUT de una instrucción INSERT para obtener el valor de identidad?

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

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

He intentado OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, pero ninguno ha funcionado.

+2

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

+6

Necesita insertarlo en una variable de tabla y luego seleccionarlo. No hay sintaxis para asignar directamente a una variable escalar de la cláusula 'OUTPUT'. –

+3

La [cláusula OUTPUT] (http://msdn.microsoft.com/en-us/library/ms177564.aspx) tiene que enviar a una tabla o variable de tabla. – mellamokb

Respuesta

320

Usted puede tener el ser recién insertado ID de salida a la consola SSMS como esto:

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

Se puede utilizar esta también de, por ejemplo, C#, cuando necesite recuperar la ID de su aplicación de llamada, simplemente ejecute la consulta SQL con .ExecuteScalar() (en lugar de .ExecuteNonQuery()) para leer el resultado ID.

O si usted necesita para capturar el recién insertado ID el interior de T-SQL (por ejemplo, para el procesamiento más adelante), es necesario 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, se puede poner múltiples valores en @OutputTbl y hacer un procesamiento adicional en esos. También puede usar una tabla temporal "normal" (#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 –

+5

Puede insertar el resultado en una 'tabla real persistente'; esto es extremadamente fantástico porque significa que puede' INSERT' información en tablas 'DOS' al mismo tiempo. – gotqn

+2

Nunca use @@ IDENTIDAD para sacar desde la parte superior. Resultaron de la manera más difícil trabajar con desencadenadores y dado que estaban registrando el historial de cambios realizados en una tabla e insertando en una nueva tabla al mismo tiempo, @@ IDENTIDAD comenzó a devolver valores de la tabla de historial. hilaridad sigue desde allí! Por favor, use la solución de marc_s. por el momento he elegido el método @OutputTbl, pero estoy intrigado por las otras opciones. –

Cuestiones relacionadas