存储过程实在数据库执行一组T-SQL语句集合,经编译后放在数据库服务端。是在数据库中运用十分广泛的一种数据库对象。存储过程作为一个单元进行处理并以一个名称来标识。
直白的说,存储过程就是把多条T-SQL编程语句组装起来,起个名字,下次根据名字直接调用。
存储过程的优点
- 数据库会把存储过程事先编译成二进制可执行代码,运行存储过程时就不需要在对存储过程进行编译了,加快了执行效率。
- 模块化开发,存储过程创建完毕后可以在程序中多次被调用。而不必重新编写T-SQL语句。
- 减少网络流量,由于存储过程是保存在数据库服务器的一组T-SQL代码。不用传输很大一段T-SQL代码
- 安全性高,存储过程可以作为一种安全机制来使用,可以给不同的用户设置权限。同时,参数化存储过程,防止SQL注入。
存储过程的分类
系统存储过程
从物理上讲,系统存储过程存储在元数据库中,并且带有sp_
前缀。从逻辑上讲,系统存储过程出现在每个系统定义数据库和用户定义数据库的sys架构中。用户自己创建存储过程不要以sp_
开头
扩展存储过程
扩展存储过程通常是以xp_
为前缀。扩展存储过程允许使用其他编程语言(如C#等)创建自己的外部存储过程。其内容并不存储在SQL Server中,二十以DLL的形式单独存在。尽量别使用,可能以后会删除。
用户存储过程
用户存储过程是由用户自行创建的存储过程。
用户存储过程又分为T-SQL存储过程和CLR存储过程
T-SQL存储过程是存储的T-SQL语句。CLR存储过程是针对.NET 公共语言运行时方法的引用
创建用户存储过程
CREATE {PROC|PROCEDURE} <存储过程名>
[{@参数名 <数据类型> [=<默认值>] [OUT|OUTPUT]}[,...n]]
[WITH ENCRYPTION]
AS
{<T-SQL语句>}[,...n]
在存储过程名最前面加一个#表示创建局部临时存储过程,加##表示全局临时存储过程 @参数名 是一个形参变量,存储过程中的参数,在存储过程中可以声明一个或者多个参数,必须在执行存储过程时,为每个声明的参数赋值,有默认值的可以不用手动赋值。存储过程最多可以有2100个参数。 OUT|OUTPUT:表名参数是返回参数。该选项的值可以返回给调用语句 WITH ENCRYPTION:表示加密创建存储过程的语句文本
存储过程可以有三种形式返回值:
- RETURN n 返回一个整数值
- 指定一个OUTPUT返回参数用于返回值
- 执行T-SQL语句返回数据集,如SELECT
执行用户存储过程
[EXEC|EXECUTE]
[<@return_status>=]<存储过程名>
{[[@参数名=]{<value>|<@variable>[OUTPUT]}|[DEFAULT]]}[,...n]
@return_status:用户保存存储过程的返回状态 @参数名:在创建存储过程时定义的参数 value:给存储过程输入的参数值,实参。如果没有指定参数名,参数值必须按照创建的顺序给出 @variable:用来存储参数或者返回参数的变量。当存储过程中有输出参数时,只能用变量来接收输出参数的值,并且在后面加上OUTPUT关键字
查看存储过程
存储过程被创建之后,它的名字被存储在系统表sysobjects中,它的源代码被存储在系统表syscomments中。可以通过系统存储过程查看用户创建存储过程的相关信息
查看基本信息
[EXEC|EXECUTE] sp_help <存储过程名>
查看创建文本
[EXEC|EXECUTE] sp_helptext <存储过程名>
查看相关依赖
[EXEC|EXECUTE] sp_depends <存储过程名>
修改存储过程
ALTER {PROC|PROCEDURE} <存储过程名>
[{@参数名 <数据类型> [=<默认值>] [OUT|OUTPUT]}[,...n]]
[WITH ENCRYPTION]
AS
{<T-SQL语句>}[,...n]
删除存储过程
DROP {PROC|PROCEDURE} <存储过程名>[,..n]