SQL Sever创建和使用存储过程

须知:

注释:

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

变量:

- 局部变量:

声明
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 [,…]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容