«Оператор INSERT EXEC не может быть вложенным» с динамическим запросом - PullRequest
0 голосов
/ 20 сентября 2019

ФОН

У меня есть процедура, которая INSERT INTO ... EXEC (@sql) из динамического SQL.Результаты этой процедуры INSERTed INTO таблица вне процедуры.Когда я пытаюсь это сделать, я получаю сообщение об ошибке:

[S0001] [8164] Оператор INSERT EXEC не может быть вложенным.

Эта ошибка обсуждается в других вопросах., но для вызовов внутренних процедур вместо динамического SQL:

Пример с ошибкой:

-- =================================
-- table with test data
-- =================================

CREATE TABLE dbo.TestInsertIntoDynamicData1
(
  data nvarchar(max)
)

INSERT INTO dbo.TestInsertIntoDynamicData1
VALUES ('one1'), ('two1'), ('three1')

GO

-- =================================
-- another table with test data
-- =================================

CREATE TABLE dbo.TestInsertIntoDynamicData2
(
  data nvarchar(max)
)

INSERT INTO dbo.TestInsertIntoDynamicData2
VALUES ('one2'), ('two2'), ('three2')

GO

-- =================================
-- procedure with dynamic query
-- =================================

CREATE PROCEDURE dbo.TestInsertIntoDynamicProc
    @TableName nvarchar(100)
AS
  BEGIN
    DECLARE @Results table(
      data nvarchar(max)
    )

    DECLARE @sql nvarchar(max)
    SET @sql = '
      SELECT data
      FROM dbo.' + @TableName + ';
    '

    -- FIRST INSERT INTO ... EXEC ...
    INSERT INTO @Results  -- this INSERT is required for example
    EXEC (@sql)

    SELECT *
    FROM @Results;
  END
GO

-- =================================
-- CALL
-- =================================

DECLARE @ResultsOfProc table(
  data nvarchar(max)
)

-- SECOND INSERT INTO ... EXEC ...
INSERT INTO @ResultsOfProc (data)
EXEC dbo.TestInsertIntoDynamicProc @TableName = 'TestInsertIntoDynamicData2'

SELECT *
FROM @ResultsOfProc;

GO

DROP TABLE dbo.TestInsertIntoDynamicData1
DROP TABLE dbo.TestInsertIntoDynamicData2
DROP PROCEDURE dbo.TestInsertIntoDynamicProc

https://stackoverflow.com/a/2917775/7573844

ВОПРОС

Как обойти эту ошибку?

1 Ответ

0 голосов
/ 20 сентября 2019

Переместить INSERT INTO к динамическому запросу.Переведите переменную таблицы в временную таблицу, чтобы использовать ее в динамическом запросе.Фиксированная процедура:

CREATE PROCEDURE dbo.TestInsertIntoDynamicProcFixed
    @TableName nvarchar(100)
AS
  BEGIN
    CREATE TABLE #Results (  -- refactor to temp table
      data nvarchar(max)
    )

    DECLARE @sql nvarchar(max)
    SET @sql = '
      INSERT INTO #Results         -- move INSERT to here
      SELECT data
      FROM dbo.' + @TableName + ';
    '

    -- FIRST INSERT INTO ... EXEC ...
    EXEC (@sql)

    SELECT *
    FROM #Results;
  END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...