![SQL Server 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/709/27111709/b_27111709.jpg)
5.5 流程控制语句
流程控制语句是用来控制程序执行流程的语句,使用流程控制语句可以提高编程语言的处理能力,常用的流程控制语句有:BEGIN…END语句、IF…ELSE语句、CASE语句、WHILE语句、GOTO语句、BREAK语句、WAITFOR语句和RETURN语句等。
5.5.1 BEGIN…END语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P71_9353.jpg?sign=1739535835-raCOKE7ZYiWhlR4XEdkYiCGDsSEA0JDB-0-3086e0fe4e9b1f8df90d41d2aeaee479)
BEGIN…END语句用于将多个SQL语句组合为一个逻辑块,当流程控制语句必须执行一个包含两条或两条以上的SQL语句的语句块时,需要使用BEGIN…END语句。另外,BEGIN…END语句块允许嵌套。
例如,定义局部变量@count,如果@count值小于10,执行WHILE循环操作中的语句块,SQL语句如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P71_37533.jpg?sign=1739535835-LZ6E23GSf6DUt6RTHdHBPsJxQJSvw0rc-0-e1d526f633ac4dcfbad16ee822ea992e)
在上述代码中执行了一个循环过程,当局部变量@count值小于10的时候,执行WHILE循环内的PRINT语句打印输出当前@count变量的值,对@count执行加1操作之后回到WHILE语句的开始重复执行BEGIN…END语句块中的内容。直到@count的值大于等于10,此时WHILE后面的表达式不成立,将不再执行循环。最后打印输出当前的@count值。
5.5.2 IF…ELSE语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P71_9352.jpg?sign=1739535835-549awvZzTLvSNtWArD6392Q3y3pemGZr-0-a49bb8026d2dc5024cb333f7b0ceb875)
IF…ELSE语句用于在执行一组代码之前进行条件判断,根据判断的结果执行不同的代码。IF…ELSE语句对布尔表达式进行判断,如果布尔表达式返回TRUE,则执行IF关键字后面的语句块;如果布尔表达式返回FALSE,则执行ELSE关键字后面的语句块。语法格式如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P71_37534.jpg?sign=1739535835-nfiHaI6rlp6bFxpoGmyZ6A0csinO3rv7-0-2cdffe3af71556db67a7086e42546b98)
Boolean_expression是一个表达式,表达式计算的结果为逻辑真值(TRUE)或假值(FALSE)。当条件成立时,执行某段程序;条件不成立时,执行另一段程序。
IF…ELSE语句可以嵌套使用。
例如,使用IF…ELSE流程控制语句输出符合条件的字符串,SQL语句如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P71_37535.jpg?sign=1739535835-3HLU4rUy9vbdyAU92Y6k9MGqzxXHnrzK-0-54520843d844dd436fe4c5c065a0d36a)
上述代码的含义是:变量@age值为18,小于40,因此表达式@age<40成立,返回结果为逻辑真值(true),所以执行第5行的PRINT语句,输出结果为字符串“This is an young man!”。
5.5.3 CASE语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P72_9553.jpg?sign=1739535835-ZwYb0djLhzkPBjcWk0KYU3ypUuFwLAq6-0-87b820ff64da58e7c0e2ebc33bc23db1)
使用CASE语句可以很方便地实现多重选择的情况,CASE是多条件分支语句,相比IF…ELSE语句,CASE语句进行分支流程控制可以使代码更加清晰,易于理解。
CASE语句根据表达式逻辑值的真假来决定执行的代码流程,CASE语句有以下两种格式。
1. 格式1
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P72_37536.jpg?sign=1739535835-o1CgWlJ2lQC4nIRgLRwxrak3IYSz8Tu1-0-ca7318ab82e336e1bb8593f86750fe5d)
在第一种格式中,CASE语句在执行时,将CASE后的表达式的值与各WHEN子句的表达式值比较,如果相等,则执行THEN后面的表达式或语句,然后跳出CASE语句;否则,返回ELSE后面的表达式。
例如,使用CASE语句根据水果名称判断各个水果的产地,SQL语句如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P72_37537.jpg?sign=1739535835-8Dpae6yQLVBEMTxmHkhILqRDCaiUz6kt-0-c615a4d63b41f3698ebf6d861b78eb6b)
2. 格式2
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P72_9465.jpg?sign=1739535835-3FJMQmd2nOUFBNxDpMS90XuM35iIbIYP-0-8a7c86b0f88bf55b64976047b4b044b6)
在第二种格式中,CASE关键字后面没有表达式,多个WHEN子句中的表达式依次执行,如果表达式结果为真,则执行相应THEN关键字后面的表达式或语句,执行完毕之后跳出CASE语句。如果所有WHEN语句都为FALSE,则执行ELSE子句中的语句。
例如,使用CASE语句对水果价格进行综合评定,SQL语句如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P72_37539.jpg?sign=1739535835-PsiXPeVnL4izljNdSYYQJEKZmUUHHlAH-0-3d9b7c3c99218f753d0142ce4054e7f2)
5.5.4 WHILE循环语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_9657.jpg?sign=1739535835-ELv9Hd1wQjCWTiEt9hdgsJwLcHy8h9gW-0-1d983e3330fe9f0ced325d24b2e988e0)
WHILE语句根据条件重复执行一条或多条T-SQL代码,只要条件表达式为真,就循环执行语句。在WHILE语句中可以通过CONTINUE或者BREAK语句跳出循环。WHILE语句的基本语法格式如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_37541.jpg?sign=1739535835-ygo59lIuIqznzG9yKQaFe401MOGm6ZHp-0-b6399d7afd80a34e41a7801f4b675db8)
主要参数介绍如下。
- Boolean_expression:返回TRUE或FALSE的表达式。如果布尔表达式中含有SELECT语句,则必须用括号将SELECT语句括起来。
- {sql_statement | statement_block}:T-SQL语句或用语句块定义的语句分组。若要定义语句块,需要使用控制流关键字BEGIN和END。
- BREAK:导致从最内层的WHILE循环中退出,将执行出现在END关键字(循环结束的标记)后面的任何语句。
- CONTINUE:使WHILE循环重新开始执行,忽略CONTINUE关键字后面的任何语句。
5.5.5 GOTO语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_9656.jpg?sign=1739535835-rXZKqS8ihFGE9mauocBnPFT5tdRTxVwS-0-9f8842c118e96dda038368a398a86e34)
GOTO语句表示将执行流更改到标签处,跳过GOTO后面的T-SQL语句,并从标签位置继续处理。GOTO语句和标签可在过程、批处理或语句块中的任何位置使用。GOTO语句的语法格式如下:
先定义标签名称,使用GOTO语句跳转时,要指定跳转标签名称。
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_37544.jpg?sign=1739535835-rfxKjw3gvDElpTRnDqCWBKroRxXX393X-0-31a6440f7e716d4fd191a954fed01345)
再使用GOTO语句跳转到标签处:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_37545.jpg?sign=1739535835-bfRre8bKZ0w3w3MFDnO659qTsdLCjVB6-0-2d48667f5a0cfe67a7d364863e48a768)
5.5.6 WAITFOR语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_9655.jpg?sign=1739535835-X3MTL4qVmb5Ks7wx3jEMz16LimdCR25r-0-3c8b394d6bd2507789d4944748cb7fa3)
WAITFOR语句用来暂时停止程序的执行,直到所设定的等待时间已过或所设定的时刻快到时,才继续往下执行。延迟时间和时刻的格式为“HH:MM:SS”。在WAITFOR语句中不能指定日期,并且时间长度不能超过24小时。WAITFOR语句的语法格式如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P73_37546.jpg?sign=1739535835-deXjRUPZqj9BUR0WVM4m2aiTzZ4LXhQU-0-de73df0b59c326181c8443bd3832b31e)
主要参数介绍如下。
- DELAY:指定可以继续执行批处理、存储过程或事务之前必须经过的指定时段,最长可为24小时。
- TIME:指定运行批处理、存储过程或事务的时间点。只能使用24小时制的时间值,最大延迟为一天。
5.5.7 RETURN语句
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P74_9678.jpg?sign=1739535835-3pOTLmq8mDQEZeolOPkbG7muC8gImdyj-0-222960e0ad097f9a9130773a76b94b89)
RETURN表示从查询或过程中无条件退出。RETURN的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。RETURN之后的语句是不执行的。语法格式如下:
![](https://epubservercos.yuewen.com/2AE60C/15477656704589106/epubprivate/OEBPS/Images/Figure-P74_37550.jpg?sign=1739535835-7bSnEvxHxXZ6zY86pghoaXvlaByJcHUA-0-28938bc9743ec2b5ac58c66fabee63b3)
integer_expression为返回的整数值。存储过程可向执行调用的过程或应用程序返回一个整数值。
提示:除非另有说明,所有系统存储过程均返回0值。此值表示成功,而非0值则表示失败。RETURN语句不能返回空值。