2009-07-24 76 views
607

我一直在学习函数和存储过程很长一段时间,但我不知道为什么以及何时应该使用函数或存储过程。他们看起来和我一样,也许是因为我有点新手。函数与SQL Server中的存储过程

有人能告诉我为什么吗?

+2

http://venkatsqlinterview.blogspot.com/2011/05/what-is-difference-between-user-defined .html – Freelancer 2013-05-24 09:21:50

+0

http://wiki.answers.com/Q/What_is_difference_between_function_and_stored_procedure_in_sql_server – Freelancer 2013-05-24 09:22:10

+0

http://searchsqlserver.techtarget.com/tip/Stored-procedures-vs-functions – Freelancer 2013-05-24 09:22:36

回答

507

函数是计算值,不能对SQL Server执行永久环境更改(即不允许INSERT或UPDATE语句)。

函数可以在SQL语句中内联使用,如果它返回标量值或可以在返回结果集时加入。

值得注意的一点从评论中总结了答案。由于@Seanķ安德森:

  • 功能按照该计算机sciency定义他们必须返回值,不能改变他们接受作为参数 (参数)的数据。函数不允许改变任何东西,必须 至少有一个参数,并且它们必须返回一个值。存储 procs不必具有参数,可以更改数据库对象, 并且不必返回值。

+11

基本上不允许DML? – 2013-04-25 07:53:48

+122

函数遵循计算机的权限定义,它们必须返回一个值并且不能改变它们作为参数(参数)接收到的数据。函数不允许改变任何东西,必须至少有一个参数,并且它们必须返回一个值。存储过程不必具有参数,可以更改数据库对象,也不必返回值。 – 2013-05-14 02:30:52

+16

事实上,您可以在函数中使用INSERT,UPDATE和DELETE语句来修改本地表变量。 – Ani 2014-03-27 07:39:28

52

时要计算并返回在其他SQL语句中使用的值写用户定义的函数;在你想要的时候编写一个存储过程,而不是将一组可能复杂的SQL语句分组。毕竟这是两种截然不同的用例!

5

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

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

  2. 您可以使用存储过程来更改服务器环境参数,其中使用不能使用的功能。

欢呼

18

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

SELECT a, lookupValue(b), c FROM customers 

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

  • 不能创建永久更改
  • 不能改变数据

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

对我来说,UDF的内联使用是UDF最重要的用法。

174

函数和存储过程服务于不同的目的。虽然这不是最好的比喻,但函数可以从字面上看作任何其他编程语言中使用的函数,但存储过程更像个别程序或批处理脚本。

功能通常具有输出和可选输入。然后,输出可用作另一个函数(内置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 

这里会发生什么是表MyTable中的每一行都调用函数MyFunction。如果MyTable具有1000行,那么对数据库的另外1000个即席查询。同样,如果函数在column spec中被指定时被调用,那么将为SELECT返回的每一行调用该函数。

所以你确实需要小心编写函数。如果你从一个函数的表中做SELECT,你需要问自己,在父存储过程还是其他一些SQL构造(例如CASE ... WHEN ... ELSE ...结束)。

4

像游标一样,SQL Server函数是用来作为最后一个武器的!它们确实存在性能问题,因此应尽可能地避免使用表值函数。谈论性能是指在中级硬件服务器上托管超过1,000,000条记录的表格;否则你不需要担心功能造成的性能损失。

  1. 不要使用函数返回一个结果集到外部代码(如ADO.Net)
  2. 使用视图/存储的特效组合尽可能。您可以使用DTA(数据库优化顾问)为您提供的建议(如索引视图和统计信息) - 有时可以从未来的增长性能问题中恢复过来。

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

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

  • 存储过程同时接受输入和输出参数,但函数仅接受输入参数。

  • 函数无法返回类型为text,ntext,image的值& timestamps其中as过程可以。

  • 函数可以在create table中用作用户定义的数据类型,但程序不能。

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

这里getsal是用户定义的函数返回一个薪水类型,创建表时没有存储被分配用于薪金类型,getsal功能也是不但是当我们从这个表中获取一些值时,gets函数get会被执行,并且返回类型作为结果集返回。

416

SP和UDF下面列出的区别:

​​
47

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

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

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

以返回单个值的函数开始。好的是,您可以将经常使用的代码放入函数中,并将它们作为结果集中的列返回。

然后,您可以使用一个函数作为参数化的城市列表。 dbo.GetCitiesIn(“NY”)返回一个可以用作连接的表。

这是一种组织代码的方式。知道何时可重复使用以及何时浪费时间只能通过反复试验和经验来获得。

此外,函数是SQL Server中的一个好主意。它们速度更快,而且可以非常强大。内联和直接选择。小心不要过度使用。

1
  • 函数返回一个值,而不是存储过程是强制性的。
  • 仅在UDF中接受选择语句,而不需要DML语句。
  • 存储过程接受任何语句以及DML语句。
  • UDF只允许输入而不允许输出。
  • 存储过程允许输入和输出。
  • 捕获块不能在UDF中使用,但可以在存储过程中使用。
  • 在UDF中的函数中不允许交易,但在存储过程中允许它们。
  • 只有表变量可以用于UDF而不是临时表。
  • 存储过程允许表变量和临时表。
  • UDF不允许从函数调用存储过程,而存储过程允许调用函数。
  • UDF用于连接子句中,而存储过程不能用于连接子句中。
  • 存储过程将始终允许归零。相反,UDF具有必须回到预定点的价值。
17

根本差异

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

函数只能有输入参数,而程序可以有输入/输出参数。

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

函数可以从程序被调用,而程序不能从函数调用。

推进差异

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

程序不能在SELECT语句中使用,而函数可以嵌入在SELECT语句中。

存储过程不能用于WHERE/HAVING/SELECT部分​​中任何位置的SQL语句,而Function可以。

返回表的函数可以视为另一个行集。这可以在与其他表的JOIN中使用。

内联函数可以作为视图的参数,并且可以在JOIN和其他行集操作中使用。

异常可以通过一个过程中的try-catch块来处理,而try-catch块不能在函数中使用。

我们可以在程序中进行事务管理,但我们不能进入函数。

source

4

存储过程:

  • 就像SQL Server的一个缩影程序。
  • 可以像选择语句一样简单,也可以像添加,删除,更新和/或读取数据库中多个表中的数据的长 脚本一样复杂。
  • (可实现循环和游标,都允许您与 较小的结果工作或数据按行操作行。)
  • 应该使用EXECEXECUTE语句来调用。
  • 返回表变量,但我们不能使用OUT参数。
  • 支持交易。

功能:

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

    SELECT dbo.functionname('Parameter1') 
    

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects 
    
  • 对于简单的可重复使用的选择的操作,功能可以简化代码。 只是在你的函数中使用JOIN子句时要小心。如果您 函数有一个JOIN条款,并从另一个选择 语句返回多个结果调用它,函数调用JOIN 这些表一起每个线在结果集返回。所以 尽管它们可以有助于简化某些逻辑,但如果它们使用不当,它们也可能会成为一个 性能瓶颈。

  • 使用OUT参数返回值。
  • 不支持交易。
-1

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

enter image description here

12

存储过程被用作脚本。他们为您运行一系列命令,您可以安排它们在特定时间运行。

功能被用作方法。你传递一些东西并返回结果。应该小而快 - 在飞行中进行。

-2

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

功能:在SQL Server数据库中,函数用于执行某些操作,并且操作立即返回结果。 功能有两种类型:

  1. 系统定义

  2. 用户自定义

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

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

这里有一个实际的理由,更喜欢在存储过程的功能。如果您有一个需要另一个存储过程的结果的存储过程,则必须使用insert-exec语句。这意味着您必须创建临时表并使用exec语句将存储过程的结果插入到临时表中。这很混乱。与此有关的一个问题是insert-execs cannot be nested

如果您遇到调用其他存储过程的存储过程,您可能会遇到这种情况。如果嵌套存储过程只是简单地返回一个数据集,那么它可以用一个表值函数替换,而不会再出现这个错误。

这是另一个原因,我们应该保持业务逻辑出了数据库)的