为什么不能在另一个存储过程调用的存储过程中使用INSERT EXEC语句?

时间:2010-10-04 08:54:53

标签: sql stored-procedures exec user-defined-functions

首先,我试着解释一下情况。 我将过滤器表达式存储在一个由换行符分隔的列中。基本想法是:

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 个答案:

答案 0 :(得分:5)

与此同时,我设法解决了问题(帮助:))。解决方案很简单:

exec('insert into t2 ' + @str)

其中@str包含一个select语句 我不知道为什么,但这种方式没有错误。我调用存储过程的方法:

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

我希望通过这个解决方案为其他人节省一些时间 再见,
彼得

答案 1 :(得分:2)

这是SQL Server的限制。你不能有一个嵌套的insert exec(我不知道为什么)。

如果你去:

insert into t(value)
exec dbo.proc

,在dbo.proc内有

insert into t2(value2)
exec(@str)

,然后它就不会运行了。

考虑传递表格的不同方式,例如temporary tablestable-valued parameters

答案 2 :(得分:-1)

SQL Server上的函数有局限性, 他们不是程序,你不能使用动态SQL,如'EXECUTE STRING','INSERT EXEC'......