2012-05-31 19 views
5

Actualmente, estoy tratando de realizar una update en SQL Server (pero podría ser cualquier DML statement que soporta el output clause), y me gustaría poner el resultado en una tabla temporal local, así:¿Cómo usar la cláusula de salida en SQL para insertar, actualizar, eliminar resultados en una nueva tabla temporal?

update 
    dbo.MyTable 
set 
    MyField = 30 
output 
    inserted.MyKeyField 
into 
    #myTempTable 
from 
    dbo.MyTable as t 
where 
    f.MyFilteredField = 8 

sé que la sintaxis es correcta, según la documentación de la cláusula output (el énfasis es mío):

output_table

Specifies a table that the returned rows are inserted into instead of being returned to the caller. output_table may be a temporary table.

dicho esto, yo esperaría que funcione igual que lo haría en el la into clause en una select declaración en el sentido de que sería jus t crea la tabla.

Sin embargo, me sale el siguiente error:

Invalid object name '#myTempTable'.

¿Cómo puedo obtener los resultados de la cláusula output (inserted o deleted) en una tabla temporal?

Respuesta

11

La cláusula output no generará una nueva tabla, así que hay que generate the table beforehand which matches the structure of what is specified in the output clause, por ejemplo:

select t.MyKeyField into #myTempTable from dbo.MyTable as t where 1 = 0 

Nota, que no tiene que utilizar la sintaxis select into anterior, create table funciona igual de bien. Al final, lo que sea más fácil para crear una tabla temporal vacía que coincida con los campos en su cláusula output.

Una vez creada la tabla, el error "Nombre de objeto inválido" desaparecerá y la instrucción DML se ejecutará sin error (suponiendo que no haya otros errores).

+2

Desafortunadamente, este es el caso, ya que significa elegir entre perder la conveniencia de la detección del tipo de tabla temporal o una duplicación de código significativa. – bwerks

Cuestiones relacionadas