43.1 流程控制的定义
一般是指用来控制程序执行,一般指的是逻辑计算部分的控制。
43.2 流程控制种类
常见的流程控制有以下8种:
BEGIN ... END
WHILE
RETURN
WAITFOR
IF ... ELSE
CONTINUE
GOTO
BREAK
43.3 BEGIN ... END
BEGIN ... END语句用于将多个T-SQL语句合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的T-SQL语句的语句块时,使用BEGIN ... END语句。
语法:
BEGING SQL Statement... END
示例,我们在数据库中打印出“SQL数据库开发”
DECLARE @A VARCHAR(20) SET @A='SQL数据库开发' BEGIN SELECT @A END
结果为:
这里的SELECT @A就是一条被执行的命令语句。
43.4 IF [... ELSE]
IF [... ELSE]表示可以只使用IF,也可以IF和ELSE一起使用,表示条件判断。当满足某个条件时,就执行IF下面的语句,否则执行ELSE下面的语句。
IF语法:
IF <条件表达式> {命令行|程序块}
IF示例:
如果某字符串的长度大于5,就打印该字符串:
DECLARE @A VARCHAR(20) SET @A='SQL数据库开发' IF LEN(@A)>5 SELECT @A
结果:
这里结果与上面的BEGIN ... END一样,但是如果将条件改成大于8,结果就不是这样了。
IF ... ELSE语法:
IF <条件表达式> {命令行|程序块} ELSE {命令行|程序块}
IF ... ELSE示例:
如果字符串的长度大于10,就打印该字符,否则打印“字符串长度太短”
SELECT @A VARCHAR(20) SET @A='SQL数据库开发' IF LEN(@A)>10 SELECT @A ELSE SELECT '字符串长度太短'
结果:
很明显字符串“SQL数据库开发”长度不大于10,所以返回ELSE里的结果了。
43.5 WHILE
WHILE是循环控制,当满足WHILE后面的条件后,就可以循环执行WHILE下面的语句。通常与CONTINUE和BREAK一起使用,BREAK命令让程序完全跳出循环语句,结束WHILE命令,CONTINUE是让命令继续返回执行。
语法:
WHILE <条件表达式> {命令行|程序块} CONTINUE {命令行|程序块} BREAK {命令行|程序块}
示例:有1到10这样一组数字,从1按顺序开始,遇到偶数就跳过,遇到奇数就打印出来,当遇到9就结束打印。
DECLARE @i INT; SET @i=0; WHILE(@i<10) BEGIN SET @i=@i+1; IF(@i%2=0) BEGIN PRINT('跳过偶数数'+CAST(@i AS varchar)); CONTINUE; END ELSE IF (@i=9) BEGIN PRINT('到'+CAST(@i AS varchar)+'就结束打印'); BREAK; END PRINT @i; END
结果:
43.6 RETURN
RETURN语句用于使程序从一个查询、存储过程或批量处理中无条件返回,其后面的语句不再执行。如果在存储过程中使用RETURN语句,那么此语句可以指定返回给调用程序、批处理或过程的整数;如果没有为RETURN指定整数值,那么该存储过程将返回0。
语法:
RETURN [整数表达式]
示例:
BEGIN PRINT(1); PRINT(2); RETURN; PRINT(3);--在RETURN之后的代码不会被执行,因为会跳过当前批处理 PRINT(4); END GO BEGIN PRINT(5); END
结果:
RETURN后面的3-4都没打印,说明在当前批处理的RETURN后都没执行,而新起的BEGIN ... END不受上面的RETURN影响,所以打印了5。
43.7 GOTO
GOTO命令用来改变执行的流程,使程序跳转到标识符指定的程序行再继续往下执行。
GOTO命令虽然增加了程序设计的灵活新,但破坏了程序的结构化,使程序结构变得复杂而且难以测试。
注意:
(1)语句标识符可以是数字或者字母的组合,但必须以“:”结束。而在GOTO语句后的标识符不必带“:”。
(2)GOTO语句和跳转标签可以在存储过程、批处理或语句块中的任何地方使用,但不能超出批处理的范围。
语法:
GOTO 标识符
示例:
DECLARE @i INT; SET @i=1; PRINT @i; SET @i=2; PRINT @i; GOTO ME; SET @i=3;--这行被跳过了 PRINT @i; ME:PRINT('跳到我了?'); PRINT @i
结果如下:
从上面可以看出,当跳到ME的时候,GOTO之前的数有打印,之后的数就跳过了。
43.8 WAITFOR
用于挂起语句的执行,直到指定的时间点或者指定的时间间隔。
注意:
WAITFOR常用于某个特定的时间点或者时间间隔自动执行某些任务。在WAITFOR语句中不能包含打开游标,定义视图这样的操作。在包含事务的语句中不要使用WAITFOR,因为WAITFOR语句在时间点或者时间间隔执行期间将一直拥有对象的锁,当事务中包含WAITFOR语句,事务的其他语句又需要访问被锁住的数据对象,就容易发生死锁现象。
指定时间点的语法:
WAITFOR TIME <具体时间>
示例:
在'17:10:00'执行打印字符串“SQL数据库开发”
WAITFOR TIME '17:10:00' PRINT 'SQL数据库开发'
如果执行语句,如果在这个时间点之前,那么等到这个时候它就会打印字符串;如果在今天这个时间点之后,那需要等到第二天的这个时间点才会打印。在未执行之前查询窗口一直是“正在执行查询...”状态。
指定等待时间间隔的语法:
WAITFOR DELAY 'INTERVAR'
INTERVAR为时间间隔,指定执行WAITFOR语句之前需要等待的时间,最多为24小时。
示例:
WAITFOR DELAY '00:00:30' PRINT 'SQL数据库开发'
在等待30秒钟后,会打印出字符串。
43.9 批注
流程控制是SQL开发中经常需要使用到的,特别是条件判断IF...ELSE,循环执行WHILE是经常使用的,对于想在SQL开发中有所提高的同学,务必要掌握这几个流程控制的用法。