存储过程实在数据库执行一组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 公共语言运行时方法的引用

创建用户存储过程

  1. CREATE {PROC|PROCEDURE} <存储过程名>
  2. [{@参数名 <数据类型> [=<默认值>] [OUT|OUTPUT]}[,...n]]
  3. [WITH ENCRYPTION]
  4. AS
  5. {<T-SQL语句>}[,...n]

在存储过程名最前面加一个#表示创建局部临时存储过程,加##表示全局临时存储过程 @参数名 是一个形参变量,存储过程中的参数,在存储过程中可以声明一个或者多个参数,必须在执行存储过程时,为每个声明的参数赋值,有默认值的可以不用手动赋值。存储过程最多可以有2100个参数。 OUT|OUTPUT:表名参数是返回参数。该选项的值可以返回给调用语句 WITH ENCRYPTION:表示加密创建存储过程的语句文本

存储过程可以有三种形式返回值:

  1. RETURN n 返回一个整数值
  2. 指定一个OUTPUT返回参数用于返回值
  3. 执行T-SQL语句返回数据集,如SELECT

    执行用户存储过程

    1. [EXEC|EXECUTE]
    2. [<@return_status>=]<存储过程名>
    3. {[[@参数名=]{<value>|<@variable>[OUTPUT]}|[DEFAULT]]}[,...n]

    @return_status:用户保存存储过程的返回状态 @参数名:在创建存储过程时定义的参数 value:给存储过程输入的参数值,实参。如果没有指定参数名,参数值必须按照创建的顺序给出 @variable:用来存储参数或者返回参数的变量。当存储过程中有输出参数时,只能用变量来接收输出参数的值,并且在后面加上OUTPUT关键字

查看存储过程

存储过程被创建之后,它的名字被存储在系统表sysobjects中,它的源代码被存储在系统表syscomments中。可以通过系统存储过程查看用户创建存储过程的相关信息

查看基本信息

  1. [EXEC|EXECUTE] sp_help <存储过程名>

查看创建文本

  1. [EXEC|EXECUTE] sp_helptext <存储过程名>

查看相关依赖

  1. [EXEC|EXECUTE] sp_depends <存储过程名>

修改存储过程

  1. ALTER {PROC|PROCEDURE} <存储过程名>
  2. [{@参数名 <数据类型> [=<默认值>] [OUT|OUTPUT]}[,...n]]
  3. [WITH ENCRYPTION]
  4. AS
  5. {<T-SQL语句>}[,...n]

删除存储过程

  1. DROP {PROC|PROCEDURE} <存储过程名>[,..n]