2011-04-05 11 views

Respuesta

109

Necesita una variable de tabla y puede ser así de simple.

declare @ID table (ID int) 

insert into MyTable2(ID) 
output inserted.ID into @ID 
values (1) 
+17

Pero entonces tendría que "SELECCIONAR @someInt = ID FROM @ID". Quería saber si es posible omitir ese paso adicional (y la variable de tabla intermediaria) si todo lo que necesito es la int resultante. – Benoittr

+0

@Benoittr - Eso depende de cómo va a usar el valor, puede que no sea necesario, puede usar la tabla en una cláusula from de una instrucción select. Cuando asigna una variable, también debe asegurarse de que la inserción solo inserte una fila. Y si el inserto solo insertó una fila, ¿quizás es más fácil obtener lo que se usa en la cláusula de valores directamente en lugar de usar 'output'? –

+1

En el caso del valor generado automáticamente, no siempre es posible conocer los valores de antemano (identidad, columnas calculadas). Entiendo que hay muchas soluciones. Aún así, me diste la respuesta que estaba buscando. Gracias – Benoittr

20

Más de un año después ... si lo que necesita es obtener el ID generado automáticamente de una mesa, sólo puede

SELECT @ReportOptionId = SCOPE_IDENTITY() 

De lo contrario, parece que le pegan con el uso de una tabla .

+5

La variable que estaba buscando realmente era algo más que la columna de identidad. Aún así, gracias por la respuesta. – Benoittr

+11

Aparentemente esto tiene problemas en un plan paralelo de varios procesadores, y OUTPUT es el único método siempre confiable. – andrewb

+4

SCOPE_IDENTITY() puede devolver algo incluso si * last * INSERT no insertó nada, ¿verdad? Eso lo haría inutilizable en algunos casos. –

Cuestiones relacionadas