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

发布于 2024-09-26 03:21:03 字数 543 浏览 8 评论 0原文

首先我尝试解释一下当时的情况。 我将过滤器表达式存储在以换行符分隔的一列中。基本思想是这样的:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

随遇而安 2024-10-03 03:21:03

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

exec('insert into t2 ' + @str)

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

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

我希望我能抽出一些时间向其他人提供这个解决方案。
再见,
彼得

In the meantime I managed to solve the problem (with help :) ). The solution is simple:

exec('insert into t2 ' + @str)

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:

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

I hope I spare some time to other folks with this solution.
Bye,
Péter

把昨日还给我 2024-10-03 03:21:03

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

如果你去:

insert into t(value)
exec dbo.proc

,并且在 dbo.proc 中你有

insert into t2(value2)
exec(@str)

,那么它将不会运行。

考虑传递表的不同方式,例如临时表表值参数

It is an SQL Server restriction. You cannot have a nested insert exec (I'm not sure why).

If you go:

insert into t(value)
exec dbo.proc

, and inside dbo.proc you have

insert into t2(value2)
exec(@str)

, then it will not run.

Consider different ways of passing tables around, such as temporary tables or table-valued parameters.

俏︾媚 2024-10-03 03:21:03

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'...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文