首先,我试着解释一下情况。 我将过滤器表达式存储在一个由换行符分隔的列中。基本想法是:
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”。
(函数本身不编译)
谢谢,
彼得
答案 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 tables或table-valued parameters。
答案 2 :(得分:-1)
SQL Server上的函数有局限性, 他们不是程序,你不能使用动态SQL,如'EXECUTE STRING','INSERT EXEC'......