SQLSever创建和使用存储过程须知:存储过程的概念

须知:

注释:

  • 单行:--
  • 多行:/* */

变量:

- 局部变量:

声明
declare @sage int,@note char(30)
赋值
set @sage=20 /一次只能给一个变量赋值/
或 select @sage=20, @note='优秀'
输出
select @sage: 输出变量的值。

- 全局变量

不需要声明;不能赋值;@@开头。

PRINT语句显示信息:

PRINT @变量名1 [,……];

流程控制语句:

1. BEGIN … END语句(语句块)

      BEGIN
         …
	     SQL语句、流程控制语句
		…
	   END;
复制代码

2、条件控制语句

IF-ELSE,嵌套的IF

3、循环控制语句

WHILE循环

4、无条件转移语句

GOTO lable

5、WAITFOR语句

WAITFOR {DELAY 时间|TIME 时间}

6、CASE语句

CASE WHEN… THEN… END

7、RETURN语句

RETURN 整型表达式

存储过程的概念

存储过程就是在SQL Server数据库中存放的查询,是存储在服务器中的一组预编译过的T-SQL语句,而不是在客户机上的前端代码中存放的查询。

存储过程优点:

(1)存储过程在服务器端运行,执行速度快。存储过程是预编译过的,当第一次调用以后,就驻留在内存中,以后调用时不必再进行编译,因此,它的运行速度比独立运行同样的程序要快。
(2)简化数据库管理。例如,如果需要修改现有查询,而查询存放在用户机器上,则要在所有的用户机器上进行修改。而如果在服务器中集中存放查询并作为存储过程,则只需要在服务器上改变一次
(3)提供安全机制,增强数据库安全性。通过授予对存储过程的执行权限而不是授予数据库对象的访问权限,可以限制对数据库对象的访问,在保证用户通过存储过程操纵数据库中数据的同时,可以保证用户不能直接访问存储过程中涉及的表及其他数据库对象,从而保证了数据库数据的安全性。另外,由于存储过程的调用过程隐藏了访问数据库的细节,也提高了数据库中的数据安全性。
(4)减少网络流量。如果直接使用T-SQL语句完成一个模块的功能,那么每次执行程序时都需要通过网络传输全部T-SQL。若将其组织成存储过程,这样用户仅仅发送一个单独的语句就实现了一个复杂的操作,将大大减少网络传输的的数据量。

存储过程的分类

在SQL Server中存储过程主要分为两类:系统存储过程和用户自定义存储过程。
系统存储过程主要存储在resource数据库中并以sp_为前缀,在任何数据库中都可以调用,在调用时不必在存储过程前加上数据库名。
用户自定义存储过程由用户自己根据需要而创建,是用来完成某项特定任务的存储过程。

系统存储过程

以字符 sp_ 开头。
物理上存储在资源数据库(resource系统数据库)中,但逻辑上出现在 每个系统数据库和用户定义数据库的 sys 架构中。
可以从任何数据库执行系统存储过程。

用户自定义存储过程

创建存储过程

简单的存储过程类似于给一组SQL语句起个名字,然后就可以在需要时反复调用;复杂一些的则需要输入和输出参数。
创建存储过程前,应注意下列几个事项:
(1)存储过程只能定义在当前数据库中。
(2)存储过程的名称必须遵循标识符的命名规则。
(3)不要创建任何使用sp_作为前缀的存储过程。
语法格式:

CREATE  PROC[EDURE]  procedure_name 
[@parameter  data_type [=default][OUTPUT]][,…]
AS 
  sql_statement
复制代码

(1)procedure_name:存储过程的名称,并且在当前数据库中必须唯一。
(2)@parameter:存储过程的形参名。
(3)default:存储过程输入参数的默认值
(4)OUTPUT:指定输出参数。此选项的值可以返回给调用EXECUTE的语句。
(5)sql_statement:存储过程中的T-SQL语句。包括定义部分和执行部分。

存储过程的执行

存储过程创建成功后,保存在数据库中。可以使用EXECUTE命令来直接执行存储过程。
语法格式:

[EXEC[UTE]] procedure_name  
  [value|@variable OUTPUT][,…]
复制代码

(1)EXECUTE:执行存储过程的命令关键字,如果此语句是批处理的第一条语句,可以省略此关键字。
(2)procedure_name:存储过程名称。
(3)value为输入参数提供实参值,@variable为一个已定义的变量,OUTPUT紧跟在变量后,说明该变量用于保存输出参数返回的值
(4)当有多个参数时,彼此用逗号分隔。
例如:

EXECUTE  sp_helpdb
复制代码

说明:关于EXEC[UTE]省略与否
如果执行存储过程是批处理中的第一条语句,可省略;
否则不能省略,必须包含 EXEC[UTE] 关键字。

创建基本存储过程

创建一个存储过程exp1 ,用于返回SC表中的所有记录。

   CREATE  PROCEDURE  exp1
   AS
     SELECT  * 
     FROM   SC;
复制代码

执行存储过程:

  EXEC  exp1;
复制代码

创建带输入参数的存储过程

创建一个存储过程exp2 ,查询指定学生的选课及成绩信息。

   CREATE  PROCEDURE  exp2  @snum char(8) 
   AS
     SELECT  * 
     FROM  SC
     WHERE  SNO=@snum   ;
复制代码

执行存储过程:

  EXEC  exp2  ‘20160001’ ;
复制代码

创建一个存储过程exp3,为SC表插入一个学生的课程及成绩。

   CREATE  PROCEDURE  exp3
       @snum char(8),@cnum char(4),  @scgrade int
   AS
     INSERT  INTO SC
     VALUES (@snum,@cnum,@scgrade);
复制代码

执行存储过程:

 EXEC   exp3  ‘20160001’,  ’0001’,  90
复制代码

创建带默认参数的存储过程

创建存储过程exp4,查询指定学生的选课及成绩信息,学生的学号要输入 。学号默认值为=‘20160001’。

   CREATE   PROCEDURE  exp4  @snum char(8)=‘20160001’
   AS
     SELECT   *       
     FROM   SC      
     WHERE   SNO=@snum;
复制代码

执行存储过程:

  EXEC exp4;
  EXEC exp4 ‘20160001’
  EXEC exp4 ‘20160089’
复制代码

创建带输出参数的存储过程

创建一个存储过程exp5,求指定学生的总分并返回。

    CREATE PROCEDURE exp5
         @snum char(8),   @sumg int OUTPUT
    AS
    SELECT  @sumg=SUM(grade)       
    FROM  SC      
    WHERE  SNO=@snum;
复制代码

执行存储过程:

DECLARE   @SG_SUM   int;	
EXEC   exp5   ‘20160001’,   @SG_SUM  output;
SELECT  @SG_SUM;
复制代码

创建存储过程GetDetailByName,查找指定学生(姓名)的学生信息。如指定学生不存在,则输出“查无此人”。
方式一:

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF(SELECT COUNT(*) FROM XSDA WHERE 姓名=@sname)>0
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
PRINT '查无此人'
复制代码

方式二:

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF EXISTS(SELECT * FROM XSDA WHERE 姓名=@sname)
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
    PRINT '查无此人'
复制代码

方式三:(此方法判断是否为空只能选择单列,不能SELECT *)

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF((SELECT 姓名 FROM XSDA WHERE 姓名=@sname)is not null)
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
    PRINT '查无此人'
复制代码

执行存储过程:

EXEC GetDetailByName '王红'
复制代码

修改存储过程

存储过程的修改是由ALTER语句来完成的。
语法格式:

ALTER PROC[EDURE] procedure_name 
[@parameter  data_type [=default][OUTPUT]][,…]
AS sql_statement
复制代码

其中,各参数的含义与CREATE PROCEDURE相同。
例如:重命名存储过程

  ALTER Procedure 过程名1 RENAME TO 过程名2;
复制代码

删除存储过程

T-SQL
语法格式:

   DROP PROC[EDURE] procedure_name [,…]
复制代码