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

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

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... стиль код работает. Я получаю сообщение об ошибке, только если пытаюсь вызвать хранимую процедуру)

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

спасибо,
Петер!--2-->

3 ответов


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

exec('insert into t2 ' + @str)

где @str содержит инструкцию select.
Не знаю почему, но так ошибки быть не может. Метод, который я называю хранимой процедурой:

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

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


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

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

insert into t(value)
exec dbo.proc

, и внутри dbo.proc вы

insert into t2(value2)
exec(@str)

, то он не будет работать.

рассмотрим различные способы передачи таблиц вокруг, такие как временные таблицы или табличные параметры.


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