Tar*_*rik 801 sql t-sql sql-server stored-procedures sql-function
我一直在学习函数和存储过程很长一段时间,但我不知道为什么以及何时应该使用函数或存储过程.他们看起来和我一样,也许是因为我对此有点新手.
有人可以告诉我为什么吗?
MyI*_*hin 691
函数是计算值,不能对SQL Server执行永久性环境更改(即不允许INSERT或UPDATE语句).
如果函数返回标量值,则可以在SQL语句中内联使用该函数;如果返回结果集,则可以将其连接在一起.
值得注意的一点是评论,总结了答案.感谢@Sean K Anderson:
函数遵循计算机技术定义,因为它们必须返回一个值,并且不能改变它们作为参数(参数)接收的数据.函数不允许更改任何内容,必须至少有一个参数,并且它们必须返回一个值.存储过程不必具有参数,可以更改数据库对象,也不必返回值.
Bha*_*tel 597
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. | |
+---------------------------------+----------------------------------------+
Run Code Online (Sandbox Code Playgroud)
Chr*_*s J 187
函数和存储过程用于单独的目的.虽然它不是最好的类比,但函数可以像任何编程语言中使用的任何其他函数一样被视为字体,但存储过程更像是单个程序或批处理脚本.
功能通常具有输出和可选输入.然后输出可以用作另一个函数(内置的SQL Server,如DATEDIFF,LEN等)的输入,或者作为SQL查询的谓词 - 例如,SELECT a, b, dbo.MyFunction(c) FROM table或SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c).
存储过程用于在事务中将SQL查询绑定在一起,并与外部世界进行交互.ADO.NET等框架不能直接调用函数,但可以直接调用存储过程.
函数确实有一个隐藏的危险:它们可能被滥用并导致相当令人讨厌的性能问题:考虑这个查询:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Run Code Online (Sandbox Code Playgroud)
MyFunction声明为:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Run Code Online (Sandbox Code Playgroud)
这里发生的是为MyTable表中的每一行调用函数MyFunction.如果MyTable有1000行,那么这是针对数据库的另外1000个临时查询.类似地,如果在列规范中指定函数时调用该函数,则将为SELECT返回的每一行调用该函数.
所以你需要小心编写函数.如果从函数中的表中执行SELECT,则需要问自己,在父存储过程或其他SQL构造中使用JOIN是否可以更好地执行SELECT(例如CASE ... WHEN ... ELSE ...结束).
Kum*_*PMP 58
存储过程和用户定义函数之间的差异:
RAISEERROROR @@ERROR.GETDATE()不能在UDF中使用.Ale*_*lli 56
当您想要计算并返回一个值以便在其他SQL语句中使用时,编写用户定义的函数; 在需要时编写存储过程,而不是将一组可能复杂的SQL语句分组.毕竟,这是两个截然不同的用例!
Aak*_*ngh 34
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.
Run Code Online (Sandbox Code Playgroud)
小智 22
基本差异
函数必须返回一个值,但在存储过程中它是可选的(过程可以返回零或n个值).
函数只能有输入参数,而程序可以有输入/输出参数.
函数需要一个输入参数,它是必需的,但存储过程可能需要o到n个输入参数.
可以从Procedure调用函数,但不能从Function调用过程.
预付差异
Procedure允许SELECT和DML(INSERT/UPDATE/DELETE)语句,而Function只允许SELECT语句.
程序不能在SELECT语句中使用,而Function可以嵌入SELECT语句中.
存储过程不能在WHERE/HAVING/SELECT部分的任何地方的SQL语句中使用,而Function可以.
返回表的函数可以视为另一个行集.这可以在JOIN中与其他表一起使用.
内联函数可以作为带参数的视图,可以在JOIN和其他Rowset操作中使用.
异常可以通过过程中的try-catch块来处理,而try-catch块不能在Function中使用.
我们可以在程序中进行事务管理,而我们不能进入功能.
Ope*_*rce 19
用户定义函数是sql server程序员可用的重要工具.您可以在SQL语句中内联使用它
SELECT a, lookupValue(b), c FROM customers
Run Code Online (Sandbox Code Playgroud)
哪里lookupValue是UDF.使用存储过程时无法使用此类功能.同时你不能在UDF中做某些事情.这里要记住的基本事情是UDF:
存储过程可以做那些事情.
对我来说,UDF的内联使用是UDF最重要的用法.
Tig*_*z32 13
存储过程 用作脚本.它们为您运行一系列命令,您可以安排它们在特定时间运行.
函数 用作方法.你传递了一些东西,它返回一个结果.应该小而快 - 它是否在飞行中.
存储过程:
EXEC或EXECUTE声明调用.OUT参数.功能:
只能用于选择记录.但是,它可以在标准SQL中非常容易地调用,例如:
SELECT dbo.functionname('Parameter1')
Run Code Online (Sandbox Code Playgroud)
要么
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
Run Code Online (Sandbox Code Playgroud)对于简单的可重用选择操作,函数可以简化代码.只是要小心JOIN在你的函数中使用子句.如果您的函数有一个JOIN子句,并且您从另一个返回多个结果的select语句调用它,则该函数调用将JOIN
这些表一起用于结果集中返回的每一行.因此,尽管它们可以帮助简化某些逻辑,但如果它们没有得到正确使用,它们也可能成为性能瓶颈.
OUT参数返回值.像游标一样,SQL Server函数可以用作你的最后一个武器!它们确实存在性能问题,因此应尽可能避免使用表值函数.谈论性能是指在中型硬件上托管在服务器上的超过1,000,000条记录的表; 否则你不必担心功能造成的性能损失.
有关进一步参考,请参阅:http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
用户定义的功能。
储存程序
| 归档时间: |
|
| 查看次数: |
641520 次 |
| 最近记录: |