为什么我们不能在相反的情况下在函数内执行存储过程?
答案 0 :(得分:6)
您无法在函数内执行存储过程,因为不允许函数修改数据库状态,并且 存储过程允许修改数据库状态。
根据定义(见CREATE FUNCTION - Limitations and Restrictions)。
用户定义的函数不能用于执行修改数据库状态的操作。
存储过程可能会修改数据库状态,也可能不会。但是SQL Server编译器不应该分析存储过程以了解它是否修改了数据库状态。因此,不允许在函数内执行存储过程。
只需计算某些东西,值或表结果,就可以了。例如,可以在SELECT
查询中调用这些函数,例如
SELECT calculate_something(a) FROM some_table;
现在考虑如果允许函数calculate_something
执行将删除some_table
中所有行的存储过程会发生什么。您的目的是使用some_table.a
列的值计算某些内容,但最终会删除some_table
中的所有行。这显然不是你想要发生的事情。
答案 1 :(得分:1)
我知道已经回答了这个问题,但是在SQL Server中,该函数不是要更改数据,而是要更改该过程。
除此之外,我想补充一点,我们不能选择一个过程或将其放在where子句中,但是我们可以使用一个函数来做到这一点。
我们使用函数来缩短代码,因此它对减少编码器的查询量大有帮助。
希望这会有所帮助。
答案 2 :(得分:0)
我怀疑这是因为函数的执行不应该以任何方式修改数据,允许你运行存储过程会让你这样做......
答案 3 :(得分:0)
您需要将存储过程更改为函数以在函数内调用它。
或者,一种方法是使用xp_cmdshell
来调用批处理文件,其中批处理文件包含执行过程语句。在函数中,您可以调用扩展过程。
例如
Create Function...
EXEC master.sys.xp_cmdshell 'C:\test.bat'
RETURN...
我绝不是说这是好习惯,但我只是说这是一种可能性。
答案 4 :(得分:0)
我们不能在函数内调用存储过程。但是,我们可以在商店过程中调用一个函数。
功能极为有限。他们无法以任何可以更改数据的方式执行任何操作。这意味着您不能使用动态sql或调用其他对象(函数除外)
答案 5 :(得分:0)
一些限制是它们的功能,例如(i)它不应该改变任何表结构。它应该只读表。但存储过程可以改变。存储过程可以进行任何更改。所以我们不能从函数中调用存储过程。
答案 6 :(得分:-1)
从技术上讲,可以从函数调用存储过程。 但请记住存储过程和函数的用途。
功能目的:该功能用于计算值,因此必须返回一个值。只要不改变数据,就可以从select语句中调用函数。 (永久表数据,而不是临时表)
存储过程的目的:存储过程用于执行业务逻辑,因此可能会也可能不会返回值。