Нельзя объединить более 1 INSERT INTO + EXEC
, это ограничение SQL Server.
DECLARE @Test TABLE (Number INT)
INSERT INTO @Test (Number)
EXEC ('
CREATE TABLE #InnerTable (SomeColumn INT);
INSERT INTO #InnerTable (SomeColumn)
EXEC (''SELECT 1'');
SELECT 1;')
Сообщение 8164, уровень 16, состояние 1, строка 4 INSERT EXECоператор не может быть вложенным.
Если мы удалим внутреннее INSERT INTO + EXEC
...
DECLARE @Test TABLE (Number INT)
INSERT INTO @Test (Number)
EXEC ('
CREATE TABLE #InnerTable (SomeColumn INT);
SELECT 1;')
Успех!
Существует несколько способовОбойти это ограничение, однако для большинства из них потребуется изменить содержимое EXEC
. Вы можете найти исчерпывающее объяснение здесь . Тот, который я обычно использую с моими процедурами, разделяет временную таблицу. Вам нужно создать временную таблицу за пределами EXEC
, а затем загрузить ее внутри. Таблица по-прежнему доступна за пределами области действия EXEC
, поскольку она была создана за пределами.
IF OBJECT_ID('tempdb..#Test') IS NOT NULL
DROP TABLE #Test
CREATE TABLE #Test (Number INT)
EXEC ('INSERT INTO #Test (Number) SELECT 1')
SELECT * FROM #Test
Недостатком этого подхода является то, что часть EXEC
может завершиться ошибкой, если временная таблица не была создана или быласоздан с неправильными именами столбцов или типов данных. Имейте в виду, что это не будет работать с таблицами переменных, они должны быть временными (по крайней мере), чтобы быть доступными внутри области действия EXEC
.