任何人都可以解释存储过程和用户定义函数之间的确切区别,以及每个函数在哪种情况下都有用吗?
答案 0 :(得分:44)
这是我一直记住的:)
来源http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function
答案 1 :(得分:14)
函数始终返回一个值,并且不执行DML语句(INSERT / UPDATE / DELETE)。
存储过程无法返回值 - 您需要使用OUT参数 - 并且可以运行DML语句。
除了上面的比较,它们是平等的。但鉴于比较,根据您需要做的事情,您可能会比使用函数更频繁地使用存储过程。
答案 2 :(得分:5)
用户定义的函数几乎没有限制,例如可以使用DML语句等。请检查
答案 3 :(得分:0)
差异:
过程可以接受输入(默认),输出和输入输出类型参数。函数只能接受输入类型的参数。
使用OUTPUT和/或INOUT参数,过程可能会或可能不会返回值,或者可能会返回多个值。一个过程可以通过OUTPUT和/或INOUT参数最多返回1024个值。 函数始终只返回一个值。
存储过程始终返回整数值,默认情况下为零。函数返回类型可以是标量或表或表值。
存储的proc可以创建一个表,但不能返回表。函数可以创建,更新和删除表变量。它可以返回一个表
存储过程可以通过使用插入,删除,更新和创建操作来影响数据库的状态。函数不会影响数据库的状态,这意味着我们无法在数据库上执行插入,删除,更新和创建操作操作。
存储过程以编译形式存储在数据库中。函数只能在运行时进行解析和编译。
可以使用exec关键字独立调用存储的proc。存储过程不能在select / where / having子句中使用。从select / where / having子句中调用函数。甚至我们都可以加入两个功能。
正常情况下,存储过程将用于执行特定任务。 函数将用于计算价值。存储过程允许getdate()或可以允许其他非确定性函数。 函数不允许使用不确定性函数,例如getdate()。
在存储过程中,我们可以使用事务处理语句。我们无法在函数中使用。
存储过程可以执行所有DML操作,例如插入新记录,更新记录和删除现有记录。该功能不允许我们像在存储过程中那样在数据库表中执行DML操作。它只允许我们执行选择操作。不允许在现有表上执行DML。但是我们仍然只能对用户定义函数内部的表变量执行DML操作。
可以在存储过程中创建临时表(派生)。对于功能,这是不可能的。
当sql语句遇到错误时,T-SQL将忽略SPROC中的错误,并继续执行其余代码中的下一条语句。如果是函数,T-SQL将停止执行下一条语句。
请参阅此链接: