为啥我们不能在 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 中的可为空的图像字段中?