函数与SQL Server中的存储过程

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

有人能告诉我为什么?


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

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

从评论中值得注意的一点是,它总结了答案。 感谢@Sean K Anderson:

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


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.    |                                        |
+---------------------------------+----------------------------------------+

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

函数通常具有输出和可选的输入。 然后,输出可以用作另一个函数(内置的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中的每一行都调用MyFunction函数。 如果MyTable具有1000行,那么对数据库的另外1000个即席查询。 同样,如果函数在column spec中被指定时被调用,那么将为SELECT返回的每一行调用该函数。

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

链接地址: http://www.djcxy.com/p/24743.html

上一篇: Function vs. Stored Procedure in SQL Server

下一篇: Select columns from result set of stored procedure