SQL Server — использование предложения WITH в инструкции INSERT

Мне было интересно, возможно ли это. У меня есть существующий запрос, который использует предложение WITH для применения некоторых агрегированных данных к запросу SELECT следующим образом: (значительно упрощено)

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

Теперь я хочу INSERT результаты этого запроса в другую таблицу.

Я пробовал следующее:

INSERT INTO tablea(a,b)
;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

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

Неправильный синтаксис рядом с ';'.

Итак, я попытался без точки с запятой, но получил ошибку:

Неправильный синтаксис рядом с ключевым словом 'WITH'.

Неверный синтаксис рядом с ключевым словом with. Если этот оператор является обычным табличным выражением или предложением xmlnamespaces, предыдущий оператор должен заканчиваться точкой с запятой.

Возможно ли то, что я пытаюсь сделать, с другим синтаксисом?


person Macs Dickinson    schedule 22.03.2013    source источник
comment
Точка с запятой ставится в конце оператора. Ставить его впереди — плохая привычка, и вы должны привыкнуть правильно завершать каждое выражение точкой с запятой.   -  person a_horse_with_no_name    schedule 22.03.2013
comment
Вы проверили документацию для INSERT утверждение? Он показывает, что CTE предшествует INSERT, и включает пример использования CTE.   -  person Pondlife    schedule 22.03.2013


Ответы (3)


Вам нужно будет поместить INSERT INTO сразу после CTE. Итак, код будет:

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
INSERT INTO tablea(a,b)
SELECT y, z 
FROM alias

См. SQL Fiddle с демонстрацией.

person Taryn    schedule 22.03.2013

Другой способ без использования CTE — обернуть его в подзапрос,

INSERT INTO tablea(a,b)
SELECT y, z 
FROM 
(
    SELECT y,z FROM tableb
) alias
person John Woo    schedule 22.03.2013
comment
@KSTech хороший вопрос. Я думал, что ОП просто упростил проблему. - person John Woo; 22.03.2013

Точка с запятой используется для завершения оператора. Поэтому, когда вы используете ;WITH, завершает предыдущий оператор. Однако это не то, почему вы получаете ошибку здесь. Проблема здесь с вашим оператором INSERT INTO, который ищет синтаксис VALUES или SELECT.

Оператор INSERT INTO можно использовать двумя способами: явно указав VALUES или предоставив результирующий набор с помощью оператора SELECT.

person CoOl    schedule 12.09.2013