TSQL: С помощью cteTABLE вставить в другую_таблицу

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

Я хочу выбрать иерархические данные и вставить их в таблицу. Поэтому мне нужно использовать статус WITH в моей вставке.

Это прекрасно работает:

create table test_table
(
 id int
) 

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

Но это порождает ошибку "неправильный синтаксис рядом с ключевым словом":

CREATE PROCEDURE p_insert_test
AS
BEGIN

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

END

Я думаю, что T-SQL не нравится ключевое слово WITH до ключевого слова INSERT. Как я могу сделать такую вставку в хранимой процедуре?

Спасибо!

1 ответ

Декларация CTE должна быть первой командой в пакете.

Просто поставьте точку с запятой перед WITH и вы должны быть в порядке:

;WITH t_Table...

РЕДАКТИРОВАТЬ:

Чтобы уточнить, почему это так, ключевое слово WITH используется также для подсказок запросов, таких как WITH RECOMPILE, WITH (NOLOCK) и т.д. Механизм запросов должен знать намерение ключевого слова WITH и единственный способ означает, что он представляет собой CTE, чтобы гарантировать, что объявления CTE являются началом партии.

В противном случае у вас может быть что-то двусмысленное:

SELECT Field
FROM MyTable
WITH CteName
As
(Select 1)

Без терминатора утверждения CteName будет неправильно прочитан как подсказка запроса, примененная к MyTable.

licensed under cc by-sa 3.0 with attribution.