

流程控制语句的使用范围和GO关键字
流程控制语句只能用在单个批处理段,用户自定义的函数,存储过程。不能跨多个批处理段或者用户自定义函数和存储过程
这里重点讲T-SQL查询语句,所以只介绍批处理段。
批处理(批处理段)是客户端应用程序发送一条或多条T-SQL语句到SQL Server,SQL Server将批处理语句作为单个可执行单元。一个批处理段是由一个或多个语句组成的一个批处理,之前之所以叫批处理是因为所有语句一次性被提交到一个SQL实例(数据库引擎,一个SQL Server就代表一个实例)。在这个批处理范围内,局部变量是互相可见的。
而想让多个语句分多次提交到SQL实例上,则需要使用GO关键字。SSMS提供了一个客户端命令GO,可以发出一批T-SQL语句结束的信号。注意:GO是客户端的工具,而不是T-SQL的服务命令。
当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。所以不在同一个批处理内部局部变量不可见,也不可对跨批处理的语句使用流程控制语句
在同一个批处理中局部变量相互可见:
在不同批处理中局部变量不可见:
在不同批处理中,流程控制流语句不能跨批处理:
T-SQL中的8个流程控制语句的关键字
下面对上述关键字进行讲解
BEGIN..END关键字
BEGIN..END关键字是流程控制语句中最基本的关键字,用于将多个语句划分为逻辑上的一部分。类似JAVA中的花括号‘{}’
WHILE/BREAK/CONTINUE关键字
在T-SQL的流程控制语句中,循环语句中只有WHILE循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标中。
1.WHILE关键字和其他高级语言中的WHILE关键字几乎一模一样,WHILE循环可以利用BREAK和CONTINUE控制流程。
2.CONTINUE关键字用于结束本次循环,直接开始下一次循环。
3.BREAK关键字用于直接跳出WHILE循环语句。
双重循环的效果也和JAVA一样,关键字只作用在自己所在的循环体中。
一个简单的例子:从1循环到10,循环到7时,结束本次循环继续下一次循环,循环到8时,结束整个循环
IF..ELSE关键字
IF..ELSE关键字实现了非此既彼的逻辑,和其他高级语言中的IF语句具有完全一样的使用方法,这里就不在讲述了,集体例子看上图。
IF语句经常会与EXISTS关键字相结合来判断数据表中指定的数据是否存在,比如:
IF (EXISTS (SELECT 1 FROM table_name WHERE column IS NOT NULL ))
BEGIN
PRINT ‘Something is null in this table’;
END
GOTO关键字
GOTO关键字的使用非常简单,定义一个跳转的标签(字段), GOTO+标签,标签+‘:’+需要执行的内容。标签像JAVA里面的封装好的方法,GOTO+标签就是调用方法。可以让程序跳转到一个指定的标签处并执行其后的代码,最佳实践只使用在错误处理中。
IF(@@ERROR<>0)
BEGIN
GOTO xxx
END
xxx: SELECT * FROM table_name WHERE @@ERROR IS NOT NULL;
RETURN关键字
RETURN关键字是最简单直接无条件告诉服务器跳出某个批处理段/自定义函数/存储过程的方式。
很多人会把RETURN语句和RAISERROR函数搞混,区别在于RAISERROR会引发错误,但不会终止程序往下进行。
WAITFOR关键字
WAITFOR关键字分为两种类型,一种是延时执行WAITFOR DELAY+‘hh:mm:ss’,另一种是指定时间执行WAITFOR TIME+‘hh:mm:ss’,不支持日期
WAITFOR TIME '00:00:00'
BEGIN
PRINT 'YES'; -----表示晚上12点才打印YES
END
WAITFOR DELAY '00:00:05'
BEGIN
PRINT 'NO'; ------表示延时5秒才打印NO
END