![SQL Server 2016从入门到精通(视频教学超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/756/26793756/b_26793756.jpg)
5.5 流程控制语句
到现在为止,介绍的T-SQL代码都是按从上到下的顺序执行,但是通过T-SQL中的流程控制语句,可以根据业务的需要改变代码的执行顺序,T-SQL中可以用来编写流程控制模块的语句有:BEGIN…END语句、IF…ELSE语句、CASE语句、WHILE语句、GOTO语句、BREAKE语句、WAITFOR语句和RETURN语句。本节将分别介绍各种不同控制语句的用法。
5.5.1 BEGIN…END语句
语句块是多条Transact-SQL语句组成的代码段,从而可以执行一组Transact-SQL语句。BEGIN和END是控制流语言的关键字。BEGIN…END语句块通常包含在其他控制流程中,用来完成不同流程中有差异的代码功能。例如,对于IF…ELSE语句或执行重复语句的WHILE语句,如果不是有语句块,这些语句中只能包含一条语句,但是实际的情况可能需要复杂的处理过程。BEGIN...END语句块允许嵌套。
【例5.32】定义局部变量@count,如果@count值小于10,执行WHILE循环操作中的语句块,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T144_40086.jpg?sign=1739419010-dONzD0l9TG7DdQgDJ24MqGTX2ubwW2bc-0-ef96cb530efa60ece03c4051b75c41ef)
代码执行结果如图5-25所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P144_7921.jpg?sign=1739419010-ly2KSzXctjrORcTW328bes4whPS5yxcd-0-d1890b5c711f59950ec64b94a1e73cc9)
图5-25 BEGIN…END语句块
该段代码执行了一个循环过程,当局部变量@count值小于10的时候,执行WHILE循环内的PRINT语句,打印输出当前@count变量的值;对@count执行加1操作之后,回到WHILE语句的开始重复执行BEGIN...END语句块中的内容;直到@count的值大于等于10,此时WHILE后面的表达式不成立,将不再执行循环。最后打印输出当前的@count值,结果为10。
5.5.2 IF…ELSE语句
IF…ELSE语句用于在执行一组代码之前进行条件判断,根据判断的结果执行不同的代码。IF...ELSE语句对布尔表达式进行判断,如果布尔表达式返回TRUE,则执行IF关键字后面的语句块;如果布尔表达式返回FALSE,则执行ELSE关键字后面的语句块。语法格式如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T145_40087.jpg?sign=1739419010-YOUAGSYOuLf67XpODYyGF5ilrQvM4P5o-0-022194d7f9ebb596006b830bfe89047a)
Boolean_expression是一个表达式,表达式计算的结果为逻辑真值(TRUE)或假值(FALSE)。当条件成立时,执行某段程序;条件不成立时,执行另一段程序。IF…ELSE语句可以嵌套使用。
【例5.33】IF…ELSE流程控制语句的使用,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T145_40088.jpg?sign=1739419010-37vQo6eOXxj7VcJyka9sAXrsSHt0dpYv-0-7ec0a48014234edf5d3e4f433a720fda)
代码执行结果如图5-26所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P145_8004.jpg?sign=1739419010-cjL8zK6Peezfw3ads3r4d6dctyuSXNAd-0-178584099bc0b8f627a8c8afd8003c79)
图5-26 IF…ELSE流程控制语句
由结果可以看到,变量@age值为40,大于30,因此表达式@age<30不成立,返回结果为逻辑假值(FALSE),所以执行第6行的PRINT语句,输出结果为字符串“This is an old man!”。
5.5.3 CASE语句
CASE是多条件分支语句,相比IF…ELSE语句,CASE语句进行分支流程控制可以使代码更加清晰,易于理解。CASE语句也根据表达式逻辑值的真假来决定执行的代码流程,CASE语句有两种格式。
1.格式1
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T145_40089.jpg?sign=1739419010-KK0ajxMFBDexZqA2yGWA0sxmcAXfK9W8-0-2073a3de6fca3bf8c18b7f3e78bc6633)
在第一种格式中,CASE语句在执行时,将CASE后的表达式的值与各WHEN子句的表达式值比较,如果相等,则执行THEN后面的表达式或语句,然后跳出CASE语句;否则,返回ELSE后面的表达式。
【例5.34】使用CASE语句根据学生姓名判断各个学生在班级的职位,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T146_40093.jpg?sign=1739419010-bItfzZpIF3tsHLY5EpnnLgHpQZBtM35a-0-f11cfeb52a6629d2a8565c5982f49585)
代码执行结果如图5-27所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P146_8122.jpg?sign=1739419010-azVsLicKqpHwUx80LOIVIvQ1mlFK6PUU-0-34fb041cd495247526fd8bf1086ca641)
图5-27 使用CASE语句对学生职位进行判断
2.格式2
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T146_40094.jpg?sign=1739419010-JMLPqeQrepqM1VaWPCoWHk7RVk04kNdb-0-7de13a6a71d3646f6ed1814b1b2967c6)
在第二种格式中,CASE关键字后面没有表达式,多个WHEN子句中的表达式依次执行,如果表达式结果为真,则执行相应THEN关键字后面的表达式或语句,执行完毕之后跳出CASE语句。如果所有WHEN语句都为FALSE,则执行ELSE子句中的语句。
【例5.35】使用CASE语句对考试成绩进行评定,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T147_40095.jpg?sign=1739419010-CWYFDZwErgft3RFSraIn6hLuSVDPEH8V-0-ee578b1355de78ca8b7d3503d9f94835)
代码执行结果如图5-28所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P147_8241.jpg?sign=1739419010-GjCIlPpprYod7bNHl6AmwIHBAaEmyYri-0-f626e897e0a820efdc937839f26817a0)
图5-28 使用CASE语句对考试成绩进行评价
5.5.4 WHILE语句
WHILE语句根据条件重复执行一条或多条T-SQL代码,只要条件表达式为真,就循环执行语句。在WHILE语句中可以通过CONTINUE或者BREAK语句跳出循环。WHILE语句的基本语法格式如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T147_40096.jpg?sign=1739419010-vqBgLYLD9uLP3nP0jqJcPGn0z9QEnF8a-0-bf40a09e77d812ff8570165adda442eb)
- Boolean_expression:返回TRUE或FALSE的表达式。如果布尔表达式中含有SELECT语句,则必须用括号将SELECT语句括起来。
- {sql_statement | statement_block}:Transact-SQL语句或用语句块定义的语句分组。若要定义语句块,需要使用控制流关键字BEGIN和END。
- BREAK:导致从最内层的WHILE循环中退出。将执行出现在END关键字(循环结束的标记)后面的任何语句。
- CONTINUE:使WHILE循环重新开始执行,忽略CONTINUE关键字后面的任何语句。
【例5.36】WHILE循环语句的使用,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T148_40097.jpg?sign=1739419010-W5SvUN7LoPLR4lu5f6X5bHpLSd8xlDjC-0-de5b1afe3784f07d93f8810ff8c3fb77)
该段代码执行过程如图5-29所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P148_8386.jpg?sign=1739419010-PWUBPUQwlfrlABeGnn5fivI3SacTuRog-0-2fb5b18dafe94f42830f1ad09d03907e)
图5-29 WHILE循环语句中的语句块嵌套
5.5.5 GOTO语句
GOTO语句表示将执行流更改到标签处。跳过GOTO后面的Transact-SQL语句,并从标签位置继续处理。GOTO语句和标签可在过程、批处理或语句块中的任何位置使用。GOTO语句的语法格式如下。
定义标签名称,使用GOTO语句跳转时,要指定跳转标签名称。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T149_40098.jpg?sign=1739419010-bMAcqrXlhRyIMaYQb8uKgbCBdJPD5SYL-0-23f364856f3464d80ded90088cac2c9b)
使用GOTO语句跳转到标签处。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T149_40099.jpg?sign=1739419010-MyQzoz2gdTh4xiYvRwSlf8zjbYVTtmCs-0-6ddc2daa8ba93c13b927884f89e4fe6a)
【例5.37】GOTO语句的使用,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T149_40100.jpg?sign=1739419010-PZYgsYAvRtnA1cMjltTZciQlshJdDA4h-0-e70b00138afcd0f0343397f88a2195e5)
代码执行结果如图5-30所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P149_8470.jpg?sign=1739419010-YHOOVgBrrAup4Xzk3oSLTGGoSePnv7ln-0-70b5569ddf268e58c20c638c4643e191)
图5-30 GOTO语句
5.5.6 WAITFOR语句
WAITFOR语句用来暂时停止程序的执行,直到所设定的等待时间已过或所设定的时刻快到,才继续往下执行。延迟时间和时刻的格式为“HH:MM:SS”。在WAITFOR语句中不能指定日期,并且时间长度不能超过24小时。WAITFOR语句的语法格式如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T149_40101.jpg?sign=1739419010-un6qtQhqlzvg5f5GSMhKXNytwOW3I46t-0-419e3c6b52b18e050847149ff059b2a0)
- DELAY:指定可以继续执行批处理、存储过程或事务之前必须经过的指定时段,最长可为24小时。
- TIME:指定运行批处理、存储过程或事务的时间点。只能使用24小时制的时间值,最大延迟为一天。
【例5.38】10s的延迟后执行SET语句,输入语句如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T150_40103.jpg?sign=1739419010-hOPIrwpJMVZST4SD3Q8HSy1hXRf3Ee5w-0-6a5a8b4fdf44bf3362f16baad46a95dd)
代码执行结果如图5-31所示。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-P150_8569.jpg?sign=1739419010-5SphljQgs6JQ2yfhQ6LmNtakniU7GPKg-0-abe40d8949d0c7a64e58c1b71fd80470)
图5-31 WAITFOR语句
该段代码为@name赋值后,并不能立刻显示该变量的值,延迟10秒钟后,将看到输出结果。
5.5.7 RETURN语句
RETURN表示从查询或过程中无条件退出。RETURN的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。RETURN之后的语句是不执行的。语法格式如下。
![](https://epubservercos.yuewen.com/4FBA48/15253388305240806/epubprivate/OEBPS/Images/Figure-T150_40104.jpg?sign=1739419010-fphHYXvbEBteDaN0qVHeMnIBYsRKuH2o-0-3adda9a86fa5a57a38321858221620b2)
integer_expression为返回的整数值。存储过程可向执行调用的过程或应用程序返回一个整数值。
提示
除非另有说明,所有系统存储过程均返回0值。此值表示成功,而非零值则表示失败。RETURN语句不能返回空值。