须知:
注释:
- 单行:--
- 多行:/* */
变量:
- 局部变量:
声明:
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 [,…]