流程控制语句是用来控制程序执行流程的语句。使用流程控制语句可以提高编程语言的处理能力。与程序设计语言(如C语言)一样,SQL提供的流程控制语句如下:
BEGIN…END IF IF...ELSE CASE WHILE WHILE...CONTINUE... BREAK RETURN GOTO WAITFOR
BEGIN...END语句用于将多个SQL语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的SQL语句的语句块时,使用BEGIN...END语句。语法如下:
BEGIN {sql_statement...} END
其中,sql_statement是指包含的SQL语句。
BEGIN和END语句必须成对使用,任何一条语句均不能单独使用。BEGIN语句后为SQL语句块,END语句指示语句块结束。
【例5.6】 在BEGIN…END语句块中完成两个变量的值交换。运行结果如图5.6所示。 (实例位置:资源包\TM\sl\5\6)
图5.6 交换两个变量的值
SQL语句如下:
declare @x int, @y int,@t int set @x=1 set @y=2 begin set @t=@x set @x=@y set @y=@t end print @x print @y
此实例不用BEGIN...END语句结果也完全一样,但BEGIN...END和一些流程控制语句结合起来更有用。在BEGIN...END中可嵌套另外的BEGIN...END定义另一程序块。
在SQL Server中为了控制程序的执行方向,也会像其他语言(如C语言)一样有顺序、选择和循环3种控制语句,其中,IF就属于选择判断结构。IF结构的语法如下:
IF<条件表达式>
{命令行|程序块}
其中,<条件表达式>可以是各种表达式的组合,但表达式的值必须是逻辑值TRUE或FALSE。其中命令行和程序块可以是符合逻辑的SQL任意语句,但含两条或两条以上语句的程序块必须加上BEGIN...END子句。
执行顺序是:遇到选择结构IF子句,先判断IF子句后的条件表达式,如果条件表达式的逻辑值是TRUE,就执行后面的命令行或程序块,然后再执行IF结构下一条语句;如果条件表达式的逻辑值是FALSE,就不执行后面的命令行或程序块,直接执行IF结构的下一条语句。
【例5.7】 判断数字“3”是否是正数。运行结果如图5.7所示。 (实例位置:资源包\TM\sl\5\7)
SQL语句如下:
declare @x int set @x=3 if @x>0 print '@x是正数' print'end'
【例5.8】 判断数字“8”的奇偶性。运行结果如图5.8所示。 (实例位置:资源包\TM\sl\5\8)
图5.7 判断数字“3”的正负
图5.8 判断数字“8”的奇偶性
SQL语句如下:
declare @x int set @x=8 if @x % 2=0 print '@x偶数' print'end'
IF选择结构可以带ELSE子句。IF...ELSE的语法如下:
IF<条件表达式> {命令行1|程序块1} ELSE {命令行2|程序块2}
如果逻辑判断表达式返回的结果是TRUE,那么程序接下来会执行命令行1或程序块1;如果逻辑判断表达式返回的结果是FALSE,那么程序接下来会执行命令行2或程序块2。无论哪种情况,最后都要执行IF...ELSE语句的下一条语句。
【例5.9】 判断两个数“8”和“3”的大小。运行结果如图5.9所示。 (实例位置:资源包\TM\sl\5\9)
SQL语句如下:
declare @x int,@y int set @x=8 set @y=3 if @x>@y print '@x大于@y' else print'@x小于或等于@y'
IF...ELSE结构还可以嵌套解决一些复杂的判断。
【例5.10】 输入一个坐标值(8,−3),然后判断它在哪一个象限。运行结果如图5.10所示。 (实例位置:资源包\TM\sl\5\10)
图5.9 判断两个数的大小
图5.10 判断坐标位于的象限
SQL语句如下:
使用CASE语句可以很方便地实现多重选择的情况,比IF...THEN结构有更多的选择和判断的机会,从而避免编写多重的IF...THEN嵌套循环。
SQL支持CASE有以下两种语句格式。
简单CASE函数:
CASE搜索函数:
CASE函数的参数及其说明如表5.5所示。
表5.5 CASE函数的参数及其说明
下面介绍简单CASE函数和CASE搜索函数两种格式的执行顺序。
(1)计算input_expression,然后按指定顺序对每个WHEN子句的input_expression=when_expression进行计算。
(2)如果input_expression = when_expression为TRUE,则返回result_expression。
(3)如果没有取值为TRUE的input_expression = when_expression,则当指定ELSE子句时,SQL Server将返回else_result_expression;若没有指定ELSE子句,则返回NULL值。
(1)按指定顺序为每个WHEN子句的Boolean_expression求值。
(2)返回第一个取值为TRUE的Boolean_expression的result_expression。
(3)如果没有取值为TRUE的Boolean_expression,则当指定ELSE子句时,SQL Server将返回else_result_expression;若没有指定ELSE子句,则返回NULL值。
【例5.11】 在tb_Grade表(见图5.11)中,查询每个同学的成绩。如果成绩大于或等于90,显示成绩优秀;如果成绩小于90大于或等于80,显示成绩良好;如果成绩小于80大于或等于70,显示成绩及格,否则将显示不及格。运行结果如图5.12所示 。(实例位置:资源包\TM\sl\5\11)
图5.11 tb_Grade表
图5.12 用CASE查询tb_Grade表
SQL语句如下:
WHILE子句是SQL语句支持的循环结构。在条件为TRUE的情况下,WHILE子句可以循环地执行其后的一条SQL命令。如果想循环执行一组命令,则需要配合BEGIN…END子句使用。WHILE的语法如下:
WHILE<条件表达式> BEGIN <命令行|程序块> END
遇到WHILE子句,先判断条件表达式的值。当条件表达式的值为TRUE时,执行循环体中的命令行或程序块,遇到END子句自动地再次判断条件表达式的值的真假,决定是否执行循环体中的语句。只有当条件表达式的值为FALSE时,才结束执行循环体的语句。
【例5.12】 求1~10的整数的和。运行结果如图5.13所示。 (实例位置:资源包\TM\sl\5\12)
图5.13 求1~10的整数的和
SQL语句如下:
declare @n int,@sum int set @n=1 set @sum=0 while @n<=10 begin set @sum=@sum+@n set @n=@n+1 end print @sum
循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。语法如下:
WHILE<条件表达式> BEGIN <命令行|程序块> [BREAK] [CONTINUE] [命令行|程序块] END
其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令。BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。
【例5.13】 求1~10偶数的和,并用CONTINUE控制语句输出。运行结果如图5.14所示。 (实例位置:资源包\TM\sl\5\13)
图5.14 求1~10偶数的和
SQL语句如下:
declare @x int,@sum int set @x=1 set @sum=0 while @x<10 begin set @x=@x+1 if @x%2=0 set @sum=@sum+@x else continue end print @sum
RETURN语句用于从查询或过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出。位于RETURN之后的语句不会被执行。语法如下:
RETURN[整数值]
在括号内可指定一个返回值。如果没有指定返回值,SQL Server根据程序执行的结果返回一个内定值。RETURN命令返回的内定值及其含义如表5.6所示。
表5.6 RETURN命令返回的内定值及其含义
【例5.14】 RETURN语句实现退出功能。运行结果如图5.15所示 。(实例位置:资源包\TM\sl\5\14)
图5.15 RETURN实现退出功能
SQL语句如下:
DECLARE @X INT set @x=3 if @x>0 print'遇到return之前' return print'遇到return之后'
GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行。语法如下:
GOTO 标识符
标识符需要在其名称后加上一个冒号“:”。例如:
"33: " "loving: "
【例5.15】 用GOTO语句实现跳转输出小于或等于3的值。运行结果如图5.16所示。 (实例位置:资源包\TM\sl\5\15)
SQL语句如下:
WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。语法如下:
WAITFOR DELAY<’时间’>|TIME<’时间’>
其中,“时间”必须为DATETIME类型的数据,如“11:15:27”,但不能包括日期。各关键字含义如下。
DELAY:用来设定等待的时间,最多可达24 h。
TIME:用来设定等待结束的时间点。
【例5.16】 等待3 s后显示“祝你节日快乐!”,运行结果如图5.17所示。 (实例位置:资源包\TM\ sl\5\16)
图5.16 GOTO实现跳转功能
图5.17 等待3 s后输出信息
SQL语句如下:
WAITFOR DELAY'00:00:03' PRINT'祝你节日快乐!'
【例5.17】 15:00显示“《新三国演义》开始了”。 (实例位置:资源包\TM\sl\5\17)
SQL语句如下:
WAITFOR TIME'15:00:00' PRINT'《新三国演义》开始了!''