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

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

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:
Я поместил код выше вфункция табличных значений.
Результат 2:
Недопустимое использование побочного эффекта оператора INSERT EXEC внутри функции.(Сама функция не скомпилирована)

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

Ответы [ 3 ]

5 голосов
/ 04 октября 2010

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

exec('insert into t2 ' + @str)

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

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

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

2 голосов
/ 04 октября 2010

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

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

insert into t(value)
exec dbo.proc

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

insert into t2(value2)
exec(@str)

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

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

0 голосов
/ 13 мая 2013

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

...