【问题标题】:Why does using an INSERT - EXEC [stored procedure] statement in a UDF throw a side-effecting error?为什么在 UDF 中使用 INSERT - EXEC [存储过程] 语句会引发副作用?
【发布时间】:2012-07-16 14:08:06
【问题描述】:

我正在开发一个函数,该函数需要调用一个返回 N 行的存储过程,然后将结果插入到临时表中作为其处理的一部分。

在存储过程上调用 EXEC 可以正常工作: http://sqlfiddle.com/#!3/ed11a/16

那么为什么将 EXEC 的结果插入到表变量中会引发错误: http://sqlfiddle.com/#!3/ed11a/18

我得到的错误是:Invalid use of side-effecting or time-dependent operator in 'INSERT EXEC' within a function.

我知道这个错误通常是在试图操作不是函数本地的值时产生的,但是插入是在一个表变量上,所以这应该不是问题。

【问题讨论】:

    标签: sql sql-server-2005 exec user-defined-functions table-variable


    【解决方案1】:

    虽然您只是插入表变量,但不能保证您调用的存储过程不会产生副作用。没有办法阻止从函数调用的存储过程插入/更新/删除任意数据,甚至修改模式。您可能可以使用表值函数而不是存储过程调用来实现您想要做的事情。

    Alter function dbo.MyTable() 
    RETURNS  @table TABLE 
    (
        -- columns returned by the function
        Col1 int null, 
        Col2 int null, 
        Col3 int null,
        Col4 int null,
        Col5 int null, 
        Col6 int null
    
    )
    as
    Begin
    INSERT INTO @table Values( null, null, 5, null, 63, null)
    
    return 
    End
    

    【讨论】:

    • 但是即使没有 INSERT 语句,这不是真的吗?
    • 是的,由于 Exec 语句,您遇到了错误,您无法从 UDF 中调用任何存储过程
    • 我更想知道为什么它让我使用 EXEC 创建(而不是运行)一个函数,而不是使用 INSERT-EXEC。事实证明它确实允许调用扩展存储过程(msdn.microsoft.com/en-us/library/ms191007#ValidStatements),所以我猜在创建的时候,它不知道它是什么类型的 SP,但如果你将它与插入一起使用,它就知道了不能是扩展 SP 并失败。至于您的 SQL,我不是要返回表 - 我只需要它进行处理。另外,我认为您不需要临时表-您可以直接插入表变量。我将使用 SP 代替。谢谢!
    • 你说得对,我不需要临时表。我为后代更新了它。我其实不知道你可以在函数中执行存储过程,很好的发现。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多