功能与在SQL Server存储过程(Function vs. Stored Procedure i

2019-06-17 15:37发布

我一直在学习相当长的一段函数和存储过程,但我不知道为什么,当我应该用一个函数或存储过程。 他们期待着同样的我,也许是因为我对此感到有点新手。

有人能告诉我为什么吗?

Answer 1:

函数计算的值,并且不能执行到SQL服务器永久环境变化(即没有INSERT或UPDATE语句允许)。

函数可以内嵌在SQL语句中,如果它返回一个标值,或可根据它是否返回一个结果集被接合来使用。

值得注意的一点自评,这概括了答案。 由于@Seanķ安德森:

功能遵循计算机sciency定义,他们必须返回值,不能改变他们收到的参数(参数)的数据。 函数不允许改变什么,必须至少有一个参数,并且必须返回一个值。 存储特效不必有一个参数,可以改变数据库对象,而不必返回值。



Answer 2:

SP和UDF之间的差被列举如下:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+


Answer 3:

函数和存储过程服务于不同的用途。 虽然它不是最好的比喻,功能可以从字面上看,你会在任何编程语言使用的其他功能,但存储的特效更喜欢单独的程序或批处理脚本。

功能通常具有一个输出和任选的输入。 输出然后可以(一个SQL Server内置如DATEDIFF,LEN,等)用作输入到另一个功能或作为断言到SQL查询-例如, SELECT a, b, dbo.MyFunction(c) FROM tableSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)

存储的特效是用来在事务SQL查询结合在一起,接口与外面的世界。 框架如ADO.NET等不能直接调用的函数,但是他们可以直接调用存储过程。

功能确实有隐患,但:他们可能被误用而造成相当恶劣的性能问题:考虑这个查询:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

凡MyFunction的声明为:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

这里发生的是,该函数myFunction是要求在表MyTable的每一行。 如果MyTable的有1000行,那么这就是对数据库的另一个1000即席查询。 同样,如果在列规范中指定的函数被调用,则该函数将被调用由SELECT返回的每一行。

所以你必须要小心书写功能。 如果你在一个函数表选择,你要问自己是否能与父存储过程或其他一些SQL构造(如CASE一个加入...时,可以更好地进行... ELSE ...结束)。



Answer 4:

写一个用户定义函数时要计算并返回在其他SQL语句中使用的值; 当你想,而不是是一个组可能-复杂的SQL语句的编写存储过程。 这是两个非常不同的使用情况,毕竟!



Answer 5:

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

  • 存储过程不能在SELECT语句中使用。
  • 存储过程支持延迟名称解析。
  • 存储过程通常用于执行业务逻辑。
  • 存储过程可以返回任何数据类型。
  • 存储过程可以接受比用户定义的函数的输入参数的更大数量。 存储过程最多可以有21000个输入参数。
  • 存储过程可以执行动态SQL。
  • 存储过程支持错误处理。
  • 不确定性函数可以在存储过程中使用。

  • 用户定义的函数可以在选择语句中使用。
  • 用户定义的函数不支持延迟名称解析。
  • 用户定义的函数一般用于计算。
  • 用户定义的函数应该返回一个值。
  • 用户定义的函数不能返回图像。
  • 用户定义的函数接受的比的存储过程的输入参数更小的数字。 UDF可以有多达1023个输入参数。
  • 临时表不能在用户定义的函数被使用。
  • 用户定义函数不能执行动态SQL。
  • 用户定义的函数不支持错误处理。 RAISEERROR@@ERROR在UDF是不允许的。
  • 不确定性函数不能在UDF的使用。 例如, GETDATE()不能在UDF的使用。


Answer 6:

基本区别

函数必须返回一个值,但在存储过程是可选的(程序可以返回零倍或正的值)。

功能可以具有用于它仅输入参数,而程序可以具有输入/输出参数。

函数采用一个输入参数是强制性的,但存储过程可能需要O与N的输入参数..

功能可以从程序调用的程序,而无法从函数被调用。

高级差异

程序允许选择和DML(INSERT / UPDATE / DELETE)在其声明中,而功能只允许SELECT语句中它。

过程不能在SELECT语句中被使用,而功能可以嵌入在一个SELECT语句。

存储过程不能在SQL语句中使用的任何地方WHERE / HAVING / SELECT部分​​,而功能即可。

返回表函数可以被视为另一行集。 这可以用来与其他表的连接。

内联函数可以但作为接受参数,可以在连接和其他行集操作中使用的意见。

异常可以由try-catch块在操作步骤进行处理而try-catch块不能在功能中使用。

我们可以去事务管理程序,而不能在功能去。

资源



Answer 7:

              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                           statements.


Answer 8:

一个用户定义函数可用到SQL Server程序员的一个重要工具。 您可以在SQL语句中内嵌使用它像这样

SELECT a, lookupValue(b), c FROM customers 

其中lookupValue将是一个UDF。 使用存储过程时,这种功能是不可能的。 同时,你不能做一个UDF内部的某些东西。 这里要记住的基本的事情是,UDF的:

  • 不能创建永久的变化
  • 无法更改数据

存储过程可以做这些事情。

对于我一个UDF的内联用法是UDF的最重要的用途。



Answer 9:

存储过程 使用的脚本 。 他们跑系列为你的命令,你可以安排他们在特定时间运行。

函数作为方法。 你通过它的东西,它返回一个结果。 应该是小而快 - 它的飞行。



Answer 10:

存储过程:

  • 就像SQL Server的一个缩影程序。
  • 可以作为SELECT语句一样简单,或复杂如,增加了,长长的脚本删除,更新和/或从数据库中的多个表中读取数据。
  • (可实现循环和游标,都允许通过的数据行操作更小的结果或行工作。)
  • 应使用被称为EXECEXECUTE语句。
  • 返回表变量,但我们不能用OUT参数。
  • 支持交易。

功能:

  • 不能用于更新,删除或添加记录到数据库中。
  • 简单地返回一个值或表值。
  • 只能用来选择记录。 但是,它可以很容易地从标准SQL,如中调用:

     SELECT dbo.functionname('Parameter1') 

    要么

     SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects 
  • 对于简单的可重复使用的选择操作,功能可以简化代码。 只是要小心使用JOIN在功能条款。 如果你的函数有一个JOIN子句,你从返回多个结果另一个SELECT语句调用它,该函数调用将JOIN的表一起在结果集中返回的每一行。 所以,虽然他们可以在简化了一些逻辑有用,他们也可以是一个性能瓶颈,如果他们不正确使用。

  • 使用返回值OUT参数。
  • 不支持事务。


Answer 11:

要决定何时使用何种以下几点可能会帮助 -

  1. 存储过程不能返回表变量,其中的功能可以做到这一点。

  2. 您可以使用存储过程与使用功能,你不能在那里改变服务器环境参数。

干杯



Answer 12:

SQL Server的功能,如游标,旨在作为你最后的武器! 他们确实有性能问题,因此使用表值函数应避免尽可能。 谈到性能谈论与超过100万点的记录托管在一个中产阶级的硬件服务器上的表; 否则,你不必担心造成功能的性能命中。

  1. 从不使用函数来返回结果集到外部代码(如ADO.Net)
  2. 使用视图/存储的特效组合尽可能多地。 你可以从未来的成长性能问题使用建议DTA(数据库引擎优化顾问)会给你(如索引视图和统计)恢复--sometimes!

进一步参考参见: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html



Answer 13:

开始与返回单值函数。 这种做法的好处是,你可以把经常使用的代码放到一个函数,并返回它们作为一个结果集的一列。

然后,你可以使用一个功能城市的参数列表。 dbo.GetCitiesIn(“NY”)返回,可用于为连接的表。

这是组织代码的方式。 当事情是知道重复使用,当它是在浪费时间,只有通过试错和经验的东西。

此外,功能是在SQL Server是一个好主意。 它们是速度更快,可以说是相当强大的。 内联和直接选择。 小心不要过度使用。



Answer 14:

  • 它是强制性的函数返回一个值,而不是存储过程。
  • Select语句而不是必需的DML语句在UDF仅接受。
  • 存储过程接受任何语句以及DML语句。
  • UDF只允许输入和不输出。
  • 存储过程允许输入和输出。
  • catch块不能在UDF中使用,但可以在存储过程中使用。
  • 没有交易允许在UDF功能,但是在存储过程中,他们被允许。
  • 只有表变量可以在UDF,而不是临时表中。
  • 存储过程允许针对表变量和临时表。
  • UDF不允许同时存储过程允许呼叫的函数从函数调用存储过程。
  • 使用UDF中加入条款,而存储过程不能用于连接语句。
  • 存储过程将始终允许返回到零。 UDF,相反,有必须拿出值 - 返回到预定点。


Answer 15:

这里有一个实际的理由,更喜欢在存储过程的功能。 如果您有需要另一个存储过程的结果的存储过程,你必须使用一个插入-exec语句。 这意味着,你必须创建一个临时表和使用exec语句来插入存储过程的结果到临时表。 它的混乱。 与此一个问题是, 嵌入高管不能嵌套 。

如果你坚持与调用其它存储过程的存储过程,你可能会碰到这一点。 如果嵌套的存储过程只是返回一个数据集,它可以用一个表值函数来代替,你会不会再出现此错误。

这是另一个原因,我们应该保持业务逻辑从数据库中



Answer 16:

  • 函数可以在SELECT语句中作为其中的程序无法使用。

  • 存储过程需要输入和输出参数,但功能只需要输入参数。

  • 函数不能返回类型的text,ntext,图像和时间戳值,其中的程序即可。

  • 在创建表,但过程不能功能可以作为用户定义的数据类型。

***如:-create table <tablename>(name varchar(10),salary getsal(name))

这里getsal是用户定义的函数返回一个工资的类型,在创建表时没有存储分配给工资类型,则也不会执行getsal功能,但是,当我们从该表中,getsal函数来获取的获取一些值执行,返回类型返回结果集。



Answer 17:

我意识到这是一个非常古老的问题,但我没有看到一个重要的方面中的任何问题的答案中提到:内联到查询计划。

功能可以...

  1. 标量:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. 多语句表值:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. 内嵌表值:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

第三类(内嵌表值)的查询优化处理,基本上如(参数化)的观点,这意味着从你的查询参照的功能类似于复制粘贴功能的SQL体(不实际的复制粘贴),领先以下好处:

  • 查询规划可以优化内联函数的执行,就像它的任何其他子查询(例如删除未使用的列,推谓词下来,选择不同的连接策略等)。
  • 结合几个inline函数并不需要将其送入下一个之前从第一个物化的结果。

上述可导致潜在的节省显著性能,结合的功能的多个层次时尤其如此。


注:看起来的SQL Server 2019将引入某种形式的标量函数内联为好。



Answer 18:

在SQL Server中,函数和存储过程是两种不同类型的实体。

功能:在SQL Server数据库中,该功能用于执行一些动作和动作立即返回一个结果。 功能有两种类型:

  1. 系统定义

  2. 用户自定义

存储过程:在SQL Server中,存储过程都存储在服务器,它可以返回零,单个和多个值。 存储过程有两种类型:

  1. 系统存储过程
  2. 用户定义的过程


文章来源: Function vs. Stored Procedure in SQL Server