【问题标题】:Why can't use INSERT EXEC statement within a stored procedure called by another stored procedure?为什么不能在另一个存储过程调用的存储过程中使用 INSERT EXEC 语句?
【发布时间】:2023-03-05 07:49:01
【问题描述】:

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

SELECT  
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + ''''
FROM dbo.topic_filter T
WHERE
  T.id = @id
FOR XML PATH('')

在此之后,我只需执行此字符串以将数据放入临时表中。 我的问题从这里开始。 sn -p 在一个存储过程中,被多个存储过程用来生成要填充的基源。
方法一:
从另一个 SP 调用此 sp 以填充临时表。
结果 1:
INSERT EXEC 语句不能嵌套。 (如果我只是用 exec dbo... 风格调用代码正在工作。如果我尝试在存储过程中调用,我只会收到错误)

方法2:
我将上面的代码放入表值函数中。
结果 2:
在函数中无效使用副作用运算符“INSERT EXEC”。 (函数本身不编译)

谢谢,
彼得

【问题讨论】:

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


    【解决方案1】:

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

    exec('insert into t2 ' + @str)
    

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

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

    我希望我能用这个解决方案为其他人腾出一些时间。
    再见,
    彼得

    【讨论】:

    • 这修复了我的错误“另一个会话正在使用事务上下文”在链接服务器之间进行。谢谢!
    【解决方案2】:

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

    如果你去:

    insert into t(value)
    exec dbo.proc
    

    ,在 dbo.proc 里面你有

    insert into t2(value2)
    exec(@str)
    

    ,那么它就不会运行了。

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

    【讨论】:

    • 您好 GSerg,我不明白这对核心问题有何影响。字符串转换为表格的部分仍然必须位于调用堆栈的底部。所以简化我的问题,如何将该字符串放入表中并在其上方的存储过程中使用结果?谢谢,彼得
    • 只是猜测,但为了避免无限循环。
    【解决方案3】:

    SQL Server 上的功能有限制, 它们不是过程,您不能使用动态 SQL,例如 'EXECUTE STRING'、'INSERT EXEC'...

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多