第6章 T-SQL编程
BEGIN
PRINT '收入水平较高' END ELSE
PRINT '收入水平较低'
运行结果如图6.2所示。
图6.2 例6-4执行结果
提示:条件表达式中可以包含SELECT子查询,但必须用圆括号括起来。
2.CASE语句
CASE表达式可以根据不同的条件返回不同的值,CASE不是独立的语句,只用于SQL语句中允许使用表达式的位置。
(1) 简单CASE?END表达式 命令格式:
CASE 测试表达式
WHEN 常量值1 THEN 结果表达式1
[ { WHEN 常量值2 THEN 结果表达式2 } [ ?n ] ] ELSE 结果表达式n ] END
说明:
根据测试表达式的值得到一个对应值。先计算测试表达式的值,将测试表达式的值按顺序依次与WHEN指定的各个常量值进行比较:
? 如果找到了一个相等常量值,则整个CASE表达式取相应THEN指定的结果表达
式的值,之后不再比较,跳出CASE?END。
? 如果找不到相等的常量值,则取ELSE指定的结果表达式n。 ? 如果找不到相等的常量值也没有使用ELSE,则返回NULL。
例6-5】 查询教师工资,工资为3000元的显示“平均收入者”,工资为2000元的显示为“低收入者”,工资为
4000元的显示为“高收入者”,其余的显示“未知”。
129
【SQL Server 2005 数据库原理与应用案例教程
Use Student_Course_Teacher
Go
SELECT tn 教师姓名, 收入水平=CASE sal
WHEN 3000 THEN '平均收入者' WHEN 2000 THEN '低收入者' WHEN 4000 THEN '高收入者' ELSE '未知' END FROM T
运行结果如图6.3所示。
图6.3 例6-5执行结果
(2) 搜索CASE ? END表达式 命令格式:
CASE
WHEN 条件表达式1 THEN 结果表达式1
{WHEN条件表达式2 THEN 结果表达式2 } [ ?n ] ] [ ELSE 结果表达式n ] END
说明:根据某个条件得到一个对应值,执行过程:
? 按顺序依次判断WHEN指定条件表达式的值,遇到第一个为真的条件表达式,则
整个CASE表达式取对应THEN指定的结果表达式的值,之后不再比较,结束并跳出CASE?END。
? 如果找不到为真的条件表达式,则取ELSE指定的结果表达式n。 ? 如果找不到为真的条件表达式也没有使用ELSE,则返回NULL。
提示:搜索CASE表达式与简单CASE表达式的语法区别是CASE后没有测试表达式,
WHEN指定的不是常量值而是条件表达式。
130
第6章 T-SQL编程
【例6-6】 查询教师工资,大于平均工资的显示“高收入者”,低于平均工资的显示为“低收入者”,否则显示为“平均收入者”。
Use Student_Course_Teacher Go
SELECT tn 教师姓名,收入水平= CASE
WHEN sal<(SELECT AVG(sal) FROM T) THEN '低收入者' WHEN sal>(SELECT AVG(sal) FROM T) THEN '高收入者' ELSE '平均收入者' END
FROM T
运行结果如图6.4所示。
图6.4 例6-6执行结果
6.2.3 循环
在程序中当需要多次重复处理某项工作时,就需使用WHILE循环语句。WHILE语句通过布尔表达式来设置一个循环条件,当条件为真时,重复执行一个SQL语句或语句块,否则退出循环,继续执行后面语句。
命令格式:
WHILE 逻辑条件表达式 BEGIN
循环体语句系列 ? [BREAK] ……
[CONTINUE] ……
END
说明:先计算判断条件表达式的值
131
SQL Server 2005 数据库原理与应用案例教程
(1) 若条件为真则执行BEGIN ? END之间的循环体语句系列,执行到END时返回到WHILE再次判断条件表达式的值。
(2) 若值为假(条件不成立)则直接跳过BEGIN ? END不执行循环。
(3) 若在执行循环体时遇到BREAK语句,则无条件跳出BEGIN ? END。
(4) 若在执行循环体时遇到CONTINUE语句,则结束本轮循环,不再执行之后的循环体语句,返回到WHILE再次判断条件表达式的值。 【例6-7】 计算1+2+3+??+100的和。
DECLARE @i Int, @sum Int
SELECT @i=1, @sum =0 -- 可以使用两个SET语句 WHILE @i<=100
SELECT @sum=@sum+@i, @i=@i+1 PRINT @sum
想一想:
如果准备给教师增加工资,每次每人增加200元,直至平均工资超过3500元结束,请问如何实现? 6.2.4 转移
GOTO用来改变程序执行的流程,使程序跳到标有标签的程序处继续执行,不执行GOTO语句和标签之间的语句。
命令格式:
说明:标签是GOTO的目标,它仅标识了跳转的目标。标签不隔离其前后的语句。执行标签前面语句的用户将跳过标签并执行标签后的语句。除非标签前面的语句本身是控制流语句(如RETURN),这种情况才会发生。
提示:尽量少使用GOTO语句。过多使用GOTO语句可能会使T-SQL批处理的逻辑难于
理解。使用GOTO实现的逻辑几乎完全可以使用其他控制流语句实现。GOTO最好用于跳出深层嵌套的控制流语句。 【例6-8】 分行打印字符1至5
DECLARE @Fcount INT BEGIN
SELECT @Fcount=1 Label_1:
PRINT Cast (@Fcount as VARCHAR) SELECT @Fcount=@Fcount+1 WHILE @Fcount<6 GOTO Label_1 END
Llabel_name:
GOTO Llabel_name
132
第6章 T-SQL编程
6.2.5 等待
WAITFOR语句用于暂时停止执SQL语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。
命令格式:
WAITFOR { DELAY ‘时间’ | TIME ’时间’ }
说明:使程序暂停指定的时间后再继续执行。 DELAY指定暂停的时间长短——相对时间。
TIME指定暂停到什么时间再重新执行程序——绝对时间。
‘时间’参数必须是datetime类型的时间部分,格式为“hh:mm:ss”,不能含有日期部分。 例6
-9】 示例
Use Student_Course_Teacher Go
WAITFOR delay '00:00:03' --将在3秒钟之后执行select语句 SELECT * FROM T
6.2.6 返回
RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行。当在存储过程中使用Return语句时,此语句可以指定返回给调用的应用程序、批处理或过程的整数值。如Return未指定值,则存储过程返回0。大多数存储过程按常规使用返回代码表示存储过程的成功或失败。没有发生错误时存储过程返回0。任何非零值表示有错误发生。
命令格式:
RETURN [integer_expression]
说明:参数integer_expression为返回的整型值。存储过程可以给调用过程或应用程序,返回整型值。
6.3 游标的使用
在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的语句代码往往使用SELECT语句。但是我们常常会遇到这样情况,即如何从有多条记录的结果集中去逐一地读取一条记录呢?游标为我们提供了一种极为优秀的解决方案。 6.3.1 游标基础
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
133
【