为什么不能在另一个存储过程调用的存储过程中使用 INSERT EXEC 语句?
首先我尝试解释一下当时的情况。 我将过滤器表达式存储在以换行符分隔的一列中。基本思想是这样的:
SELECT
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + ''''
FROM dbo.topic_filter T
WHERE
T.id = @id
FOR XML PATH('')
在此之后,我只需执行该字符串即可将数据放入临时表中。 我的问题从这里开始。 该代码段位于一个存储过程中,并被多个存储过程用来生成要填充的基本源。
方法一:
从另一个 SP 调用此 sp 来填充临时表。
结果1:
INSERT EXEC 语句不能嵌套。 (如果我简单地使用 exec dbo... 风格进行调用,则代码可以正常工作。如果我尝试在存储过程中调用,我只会收到错误)
方法 2:
我将上面的代码放入表值函数中。
结果2:
在函数中无效使用副作用运算符“INSERT EXEC”。 (函数本身不编译)
谢谢,
彼得
First I try to explain the circumstances.
I store the the filter expression in one column separated by line breaks. The base idea was this:
SELECT
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + ''''
FROM dbo.topic_filter T
WHERE
T.id = @id
FOR XML PATH('')
After this I simply execute this string to put the datas into a temp table.
My problem starts here.
The snippet is in a stored procedure and used by multiple stored procedures to generate the base source to fill.
Approach 1:
Call this sp from another SP to fill a temp table.
Result 1:
An INSERT EXEC statement cannot be nested.
(If I call simply with exec dbo... style the code is working. I only get the error if I try to call within a stored procedure)
Approach 2:
I put the code above into a table values function.
Result 2:
Invalid use of a side-effecting operator 'INSERT EXEC' within a function.
(The function itself don't compiled)
Thanks,
Péter
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
与此同时,我设法解决了这个问题(在帮助下:))。解决方案很简单:
其中 @str 包含 select 语句。
我不知道为什么,但这样就没有错误。我称之为存储过程的方法:
我希望我能抽出一些时间向其他人提供这个解决方案。
再见,
彼得
In the meantime I managed to solve the problem (with help :) ). The solution is simple:
Where @str contains a select statement.
I don't know why but this way there is no error. The method I call the stored procedure:
I hope I spare some time to other folks with this solution.
Bye,
Péter
这是 SQL Server 的限制。你不能有一个嵌套的
insert exec
(我不知道为什么)。如果你去:
,并且在
dbo.proc
中你有,那么它将不会运行。
考虑传递表的不同方式,例如临时表或表值参数。
It is an SQL Server restriction. You cannot have a nested
insert exec
(I'm not sure why).If you go:
, and inside
dbo.proc
you have, then it will not run.
Consider different ways of passing tables around, such as temporary tables or table-valued parameters.
SQL Server 上的函数有限制,
它们不是过程,您不能使用动态 SQL,如“EXECUTE STRING”、“INSERT EXEC”...
Functions on SQL Server have limitations,
they arenot procedures, you can't use dynamic SQL like 'EXECUTE STRING', 'INSERT EXEC'...