Почему нельзя использовать инструкцию INSERT EXEC в хранимой процедуре, вызываемой другой хранимой процедурой?

Сначала я пытаюсь объяснить обстоятельства. Я сохраняю выражение фильтра в одном столбце, разделенном разрывами строки. Основная идея заключалась в следующем:

SELECT  
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + ''''
FROM dbo.topic_filter T
WHERE
  T.id = @id
FOR XML PATH('')

После этого я просто выполняю эту строку, чтобы поместить данные во временную таблицу. Моя проблема начинается здесь. Фрагмент находится в хранимой процедуре и используется несколькими хранимыми процедурами для создания базового источника для заполнения.
Подход 1:
Вызов этой sp из другого SP, чтобы заполнить временную таблицу.
Результат 1:
Оператор INSERT EXEC не может быть вложенным. (Если я вызываю просто с помощью exec dbo ... style, код работает. Я получаю сообщение об ошибке, только если пытаюсь вызвать внутри хранимой процедуры)

Подход 2:
Я поместил приведенный выше код в функцию значений таблицы.
Результат 2:
Недопустимое использование побочного оператора INSERT EXEC внутри функции. (Сама функция не компилируется)

Спасибо,
Петер


person Péter    schedule 04.10.2010    source источник


Ответы (3)


А пока мне удалось решить проблему (с помощью :)). Решение простое:

exec('insert into t2 ' + @str)

Где @str содержит оператор выбора.
Я не знаю почему, но в этом случае ошибки нет. Метод, которым я вызываю хранимую процедуру:

SET @exec = 'exec dbo.trFilterTopic ''' + @id+ ''',null,null,1'
INSERT INTO #filtered
exec (@exec)

Я надеюсь, что уделю время другим людям с этим решением.
Пока,
Петер

person Péter    schedule 04.10.2010
comment
Это исправило мою ошибку Контекст транзакции, используемый другим сеансом между связанными серверами. Спасибо! - person Ron Rebennack; 02.07.2018

Это ограничение SQL Server. У вас не может быть вложенного insert exec (я не уверен, почему).

Если вы идете:

insert into t(value)
exec dbo.proc

, а внутри dbo.proc у вас есть

insert into t2(value2)
exec(@str)

, то он не запустится.

Рассмотрите различные способы передачи таблиц, например временные таблицы или возвращающие табличное значение параметры.

person GSerg    schedule 04.10.2010
comment
Привет, GSerg, я не понимаю, как это влияет на основную проблему. Часть, где строка, преобразованная в таблицу, по-прежнему должна находиться внизу стека вызовов. Так что упростите мой вопрос: как поместить эту строку в таблицу и использовать результаты в хранимых процедурах над ней? Спасибо, Петер - person Péter; 04.10.2010
comment
Только предположение, но чтобы избежать бесконечного цикла. - person Robert L Davis; 07.02.2013

Функции на SQL Server имеют ограничения, они не являются процедурами, вы не можете использовать динамический SQL, такой как 'EXECUTE STRING', 'INSERT EXEC' ...

person fausto    schedule 13.05.2013