为啥我们不能在 SQL Server 中的函数内执行存储过程

Posted

技术标签:

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

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

【问题讨论】:

想告诉我们您说的是哪个 DBMS? 也许这会对你有所帮助。 [是否可以在用户定义的函数中调用存储过程?][1] [1]:***.com/questions/12840065/… 【参考方案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 语句中调用函数。 (永久表数据,不是临时表)

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

【讨论】:

以上是关于为啥我们不能在 SQL Server 中的函数内执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?

为啥我不能删除此 SQL Server 表 [重复]

为啥我们不能从 sql 调用过程

为啥我不能为 SQL Server 2019 创建外部语言?

SQL server中某个表的字段值为啥不能修改?

为啥 Asp.net MVC4 不能使用 SQL Server Session 状态存储的 cookieless