Получение результата запроса в табличную переменную - PullRequest
0 голосов
/ 18 октября 2019

Итак, я объявил запрос в переменной varchar, например:

DECLARE @sql VARCHAR(MAX) = 'select * from table'

Я также объявил временную таблицу @Results, которая соответствует структуре столбца запроса.

Iзатем вызовите:

INSERT INTO @Results
EXEC (@sql)

Я получаю ошибку:

Невозможно вставить инструкцию INSERT EXEC.

Я также хотел бы добавитьчто запрос выполняется нормально без части

INSERT INTO @Results

Что может быть причиной? Любые советы будут с благодарностью

1 Ответ

1 голос
/ 18 октября 2019

Нельзя объединить более 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...