常常有人问存储过程和用户自定义函数的区别究竟是什么,在网络上尝试搜索,却没见到十分全的总结,于是自己做个总结:
Procedure:
- CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
- [ { @parameter [ type_schema_name. ] data_type }
- [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
- ] [ ,...n ]
- [ WITH <procedure_option> [ ,...n ] ]
- [ FOR REPLICATION ]
- AS { <sql_statement> [;][ ...n ] | <method_specifier> }
- [;]
- <procedure_option> ::=
- [ ENCRYPTION ]
- [ RECOMPILE ]
- [ EXECUTE AS Clause ]
- <sql_statement> ::=
- { [ BEGIN ] statements [ END ] }
- <method_specifier> ::=
- EXTERNAL NAME assembly_name.class_name.method_name
Function:
- CREATE FUNCTION [ schema_name. ] function_name
- ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
- [ = default ] [ READONLY ] }
- [ ,...n ]
- ]
- )
- RETURNS return_data_type
- [ WITH <function_option> [ ,...n ] ]
- [ AS ]
- BEGIN
- function_body
- RETURN scalar_expression
- END
- [ ; ]
区别:
1.嵌套
function:无限制
sp:最多32层
2.改数据操作
function:不支持
sp:支持
3.结果返回
function:可以返回标量值,返回表变量(表甚至可以定义名字) 具有不确定性,必须返回
sp:并不一定需要返回,可返回记录集。
户定义函数不能用于执行一组修改全局数据库状态的操作
4.是否可以使用非确定函数
function:不允许在用户定义函数主体中内置非确定函数。
sp:可以使用非确定函数。
5.返回值引用
function:其返回值可以被直接引用
sp:其返回值不能被直接引用
6.调用
function:在其他语句中调用select
sp:EXEC
7.是否可以使用out参数
function:function没有out参数,但是可以有返回值.
sp:可以out参数