【问题标题】:Why can we not execute a stored procedure inside a function in SQL Server为什么我们不能在 SQL Server 中的函数内执行存储过程
【发布时间】:2011-02-23 04:44:37
【问题描述】:

为什么我们不能在函数内部执行存储过程?

【问题讨论】:

标签: sql-server stored-procedures sql-function


【解决方案1】:

您不能在函数内部执行存储过程,因为不允许函数修改数据库状态,而存储过程允许修改数据库状态。

这是根据定义(见CREATE FUNCTION - Limitations and Restrictions)。

用户定义的函数不能用于执行修改数据库状态的操作。

存储过程可能会修改数据库状态,也可能不会。但是 SQL Server 编译器不必分析存储过程就可以知道它是否修改了数据库状态。因此,不允许在函数内执行存储过程。

函数的存在只是为了简单地计算某事、一个值或一个表格结果,仅此而已。例如,可以在 SELECT 查询中调用这些函数,例如

SELECT calculate_something(a) FROM some_table;

现在考虑如果允许函数calculate_something 执行一个存储过程会删除some_table 中的所有行会发生什么。您的意图是使用some_table.a 列的值来计算某些东西,但您最终...删除了some_table 中的所有行。这显然不是你想要发生的事情。

【讨论】:

    【解决方案2】:

    我知道这已经得到解答,但在 SQL Server 中,该功能不应该更改数据,而是该过程旨在更改。

    除此之外,我想补充一点,我们不能选择过程或将其放在 where 子句中,但我们可以使用函数来执行此操作。

    我们使用函数来缩短代码,因此它非常有用,因为它减少了编码器的大量查询。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我怀疑这是因为函数的执行不应该以任何方式修改数据,并且允许您运行存储过程会让您这样做......

      【讨论】:

        【解决方案4】:

        您需要将存储过程更改为函数才能从函数中调用它。

        或者,一种方法是使用xp_cmdshell 调用批处理文件,其中批处理文件包含执行过程语句。在函数中可以调用扩展过程。

        例如。

        Create Function...
        
        EXEC master.sys.xp_cmdshell 'C:\test.bat'
        
        RETURN...
        

        我绝不是说这是一种好的做法,只是说这是一种可能性。

        【讨论】:

          【解决方案5】:

          我们不能在函数中调用存储过程。但是,我们可以在存储过程中调用函数。

          功能极其有限。他们不能以任何可以更改数据的方式执行任何操作。这意味着你不能使用动态sql或调用其他对象(函数除外)

          【讨论】:

            【解决方案6】:

            一些限制是他们的功能,比如(i)它不应该改变任何表结构。它应该只读表。但是存储过程可以改变。存储过程可以做任何改变。所以我们不能从函数中调用存储过程。

            【讨论】:

              【解决方案7】:

              从技术上讲,从函数调用存储过程是可能的。 但请记住存储过程和函数的用途。

              函数的用途:该函数用于计算一个值,因此必须返回一个值。只要不改变数据,就可以从 select 语句中调用函数。 (永久表数据,不是临时表)

              存储过程的用途:存储过程用于执行业务逻辑,因此可能返回值,也可能不返回值。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-18
                • 2011-04-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-04-29
                相关资源
                最近更新 更多