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

时间:2010-05-24 11:03:31

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

为什么我们不能在相反的情况下在函数内执行存储过程?

7 个答案:

答案 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语句中调用函数。 (永久表数据,而不是临时表)

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