2010-10-04 107 views
6

首先我试着解释一下情况。 我将过滤器表达式存储在由换行符分隔的一列中。基本思路是这样的:为什么不能在另一个存储过程调用的存储过程中使用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调用只是......风格的代码工作,我只当我尝试在存储过程中调用get错误)

方法2:
我把上面的代码插入到表值函数。
结果2:
函数内副作用运算符'INSERT EXEC'的无效使用。 (函数本身不编译)

感谢,
彼得

回答

4

在此期间,我设法解决问题(与帮助:))。解决方案很简单:

exec('insert into t2 ' + @str) 

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

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

我希望我可以腾出一些时间给其他人使用此解决方案。
再见,
彼得

+2

这不起作用。至少在MS Transact SQL 2008中。 – Jackson 2013-03-05 21:47:38

2

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

如果你去:

insert into t(value) 
exec dbo.proc 

,和里面dbo.proc你有

insert into t2(value2) 
exec(@str) 

,那么它将无法运行。

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

+0

嗨GSerg,我不明白这是如何影响核心问题的。字符串转换为表格的部分仍然必须位于调用堆栈的底部。因此,简化我的问题,如何将该字符串放入表中并在其上的存储过程中使用结果?谢谢,佩特 – 2010-10-04 10:09:10

+0

只是一个猜测,但要避免无限循环。 – 2013-02-07 19:36:09

-1

SQL Server的功能有局限性, 他们arenot程序,不能使用动态SQL像 'EXECUTE STRING', 'INSERT EXEC' ......

相关问题