存储过程和用户​​定义函数的区别

Posted

技术标签:

【中文标题】存储过程和用户​​定义函数的区别【英文标题】:Difference between stored procedures and user defined functions 【发布时间】:2010-01-11 04:36:34 【问题描述】:

谁能解释一下存储过程和用户​​定义函数之间的确切区别,以及它们各自在哪些上下文中有用?

【问题讨论】:

阅读Stored Procedures vs. User Defined Functions in Microsoft SQL ServerChoice Between Stored Procedures, Functions, Views, Triggers 【参考方案1】:

这是我一直牢记在心的:)

过程可以返回 0 或 n 个值,而函数可以返回一个强制值。 过程可以有输入/输出参数,而函数只能有输入参数。 Procedure 允许在其中使用 select 以及 DML 语句,而 function 只允许在其中使用 select 语句。 函数可以从过程中调用,而过程不能从函数中调用。 异常可以由过程中的 try-catch 块处理,而 try-catch 块不能在函数中使用。 我们可以在过程中进行事务管理,而不能在函数中进行。 过程不能在 select 语句中使用,而函数可以嵌入在 select 语句中。 UDF 可用于 SQL 语句中 WHERE/HAVING/SELECT 部分中的任何位置,而存储过程不能。 可以将返回表的 UDF 视为另一个行集。这可以在与其他表的 JOIN 中使用。 内联 UDF 可以作为带有参数的视图,并可用于 JOIN 和其他 Rowset 操作。

来源http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

【讨论】:

【参考方案2】:

函数总是返回一个值,并且可以执行 DML 语句(INSERT/UPDATE/DELETE)。

存储过程不能返回值 - 您需要使用 OUT 参数 - 并且可以运行 DML 语句。

使用函数与存储过程的优势?


除了上面的比较之外,它们是相等的。但是通过比较,根据您需要做什么,您可能会更频繁地使用存储过程而不是函数。

【讨论】:

您可以将函数嵌入到其他语句中,因为它们会返回值。让您执行 SELECT * FROM TableFunction(Param1, Param2) TF INNER JOIN Table T ON T.Key=TF.FKey WHERE TF.Col1=ValueFunction(Param3) 之类的操作 @eftpotrm:这种用法不受欢迎,因为您可以将其替换为 JOIN。此外,它封装了逻辑——如果在 SELECT 部分中使用,则表示您正在运行一个相关的 SELECT,它将为返回的每一行执行。去过那里,做过,看到查询的扩展性有多差。【参考方案3】:

用户定义的函数有一些限制,比如可以使用 DML 语句等,请检查

【讨论】:

【参考方案4】:

区别

    过程可以接受输入(默认)、输出和输入输出类型参数。函数只能接受输入类型参数。

    使用 OUTPUT 和/或 INOUT 参数,过程可能会或可能不会返回一个值,或者可能返回多个值。一个过程可以通过 OUTPUT 和/或 INOUT 参数返回多达 1024 个值。 函数总是只返回一个值。

    存储过程总是返回整数值,默认为零。函数返回类型可以是标量或表或表值。

    存储过程可以创建表但不能返回表。函数可以创建、更新和删除表变量。它可以返回一个表

    存储过程可以通过使用插入、删除、更新和创建操作来影响数据库的状态。函数不能影响数据库的状态,这意味着我们不能对数据库进行插入、删除、更新和创建操作。

    存储过程以编译后的形式存储在数据库中。函数仅在运行时解析和编译。

    可以使用 exec 关键字独立调用存储的过程。在 select/where/have 子句中不能使用存储过程。从 select/where/have 子句调用函数。甚至我们可以加入两个函数。

    通常存储过程将用于执行特定任务。 函数将用于计算值。存储过程允许 getdate() 或其他非确定性函数可以被允许。 函数不允许使用 getdate() 等非确定性函数。

    在存储过程中,我们可以使用事务语句。我们不能在函数中使用。

    存储过程可以执行所有 DML 操作,例如插入新记录、更新记录和删除现有记录。该函数不允许我们像在存储过程中那样在数据库表中执行 DML 操作。它允许我们只做选择操作。它不允许对现有表执行 DML。但是我们仍然可以只对用户定义函数中的表变量进行 DML 操作。

    可以在存储过程中创建临时表(派生)。在函数的情况下是不可能的。

    当 sql 语句遇到错误时,T-SQL 将忽略 SPROC 中的错误并继续执行剩余代码中的下一条语句。对于函数,T-SQL 将停止执行下一条语句。

参考这个链接:

https://www.spritle.com/blogs/2011/03/03/differences-between-stored-procedures-and-user-defined-functions/

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含essential parts of the answer 并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 Answers that are little more than a link may be deleted

以上是关于存储过程和用户​​定义函数的区别的主要内容,如果未能解决你的问题,请参考以下文章

Mysql存储过程和函数区别介绍

MySQL自定义函数和存储过程的区别:

MySQL存储过程和自定义函数Navicat for mysql创建存储过程和函数调用存储过程和函数的区别

存储过程与自定义函数

用户定义函数和存储过程之间的性能差异

oracle存储过程和自定义函数