Как использовать предложение вывода в SQL для вывода результатов вставки, обновления, удаления в новую временную таблицу?

В настоящее время я пытаюсь выполнить update в SQL Server (но это может быть любой оператор DML который поддерживает output), и я хотел бы поместить вывод в локальную временную таблицу, например:

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

Я знаю, что синтаксис правильный, согласно документации для пункта output (выделено мной):

выходная_таблица

Указывает таблицу, в которую возвращаемые строки вставляются, а не возвращаются вызывающей стороне. output_table может быть временной таблицей.

Тем не менее, я ожидаю, что это будет работать так же, как в предложении into. в операторе select, поскольку он просто создает таблицу.

Однако я получаю следующую ошибку:

Недопустимое имя объекта '#myTempTable'.

Как я могу получить результаты предложения output (inserted или deleted) во временную таблицу?


person casperOne    schedule 31.05.2012    source источник


Ответы (1)


Предложение output не создает новую таблицу, поэтому вам нужно создать таблицу заранее, которая соответствует структуре того, что указано в предложении output, например:

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

Обратите внимание, что вам не обязательно использовать приведенный выше синтаксис select into, create table работает так же хорошо. В конце концов, проще всего создать пустую временную таблицу, которая соответствует полям в вашем предложении output.

После создания таблицы ошибка «Неверное имя объекта» исчезнет, ​​и оператор DML будет выполняться без ошибок (при условии отсутствия других ошибок).

person casperOne    schedule 31.05.2012
comment
К сожалению, это так, поскольку это означает выбор между потерей удобства определения типа временной таблицы или значительным дублированием кода. - person bwerks; 09.08.2015