流程控制语句
T-SQL中的11个流程控制语句关键字
在T-SQL中,与流程控制语句相关的关键字有11个:
BEGIN...END | BREAK |
GOTO | CONTINUE |
IF...ELSE | WHILE |
RETURN | WAITFOR |
CASLE | RAISEERROR和PRINT |
BEGIN…END关键字
BEGIN…END也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成Delphi的begin...end 或者C类语言的{},用于按块(block)顺次执行多条语句。
IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法,这里就不再讲述了,例子参看上图。
还有要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在,比如:
我想查询员工中没有上级的人,如果有这个人,则输出“XXX is our boss”,如果没有,则输出"There is no infomation about our boss”
WHILE/BREAK/CONTINUE关键字
在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。
WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。
CONTINUE关键字用于结束本次循环,直接开始下一次循环。
BREAK关键字用于直接跳出WHILE循环语句。
这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。
语法:
WHILE:
WHILE Boolean_expression
sql_statements
例:一下WHILE循环体被执行了三次。
SET @x=0
WHILE @x<3
BEGIN
@x=@X+1
PRINT 'x='+CONVERT(char(1),@x)
END
SET @x=0
WHILE @x<3
BEGIN
@x=@X+1
PRINT 'x='+CONVERT(char(1),@x)
BREAK /*此时跳出WHILE循环体只打印出x=1*/
END
SET @x=0
WHILE @x<3
BEGIN
@x=@X+1
PRINT 'x='+CONVERT(char(1),@x)
IF(@X=2)CONTINUE /*如果@x!=2则会打印一下语句,否则不会执行下一条命令*/
PRINT 'X IS NOT 2'
END
WAITFOR关键字
WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行,也就是将它之后的语句在一个指定的间隔之后执行,或未来的某个指定时间执行。
语法: WAITFOR {DELAY 'time'|TIME 'time'}
推迟等待和在特定时间执行的语法分别是WAITFOR DELAY ‘需要等待的执行时间',WAITFOR TIME ‘需要执行程序的精确时间’
可以简单的理解为:DELAY 时间段 TIME时间点
简单的语法例子如下:
WAITFOR的功能可以实现更为复杂的业务逻辑,比如:
我想开始一项促销活动,在当前时间10小时后开始,为8折,20小时后结束,变为9折:
DECLARE @EndTime DATATIME
SET @StartTime=CAST(GETDATA()+'10:00:00'AS DATATIME)/*定义开始时间*/
SET @EndTime=CAST(GETDATA()+'20:00:00'AS DATATIME) /*定义结束时间*/
WAITFOR TIME @StartTime
BEGIN
UPDATE Goods SET price=price*0.8 /*8折*/
END
WAITFOR TIME @EndtTime
BEGIN
UPDATE Goods SET price=price*0.9/*9折*/
END
GOTO关键字
GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上。
GOTO的标号语法:label:
RETURN关键字
Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),和BREAK很相似,但是有一点不同,RETURN可以返回一个整数,语法如下:RETURN [integer_expression],在学到存储过程的时候会提到。
简单的Return概念如下例子:
在存储过程中,Return语句后面可以返回数字用于返回执行状态或者错误代码。
很多人会把Return语句和RAISERROR函数搞混,区别在于RAISERROR函数会引发错误,并且程序依然会往下执行:
CASE
CASE表达式可以根据多个选择确定执行内容。CASE表达式有两种形式:
简单表达式:
CASE input_expression
WHEN when_expression THEN result_expression[...n]
[ELSE else_result_expression]
END
选择表达式:
CASE
WHEN Boolean_expression THEN result_expression[...n]
[ELSE else_result_expression]
END
例:1.简单表达式运用
GO
SELECT Name AS GoodsName,
GoodsStatus=
CASE Status
WHEN 1 THEN '正在包装,尚不能出售'
WHEN 0 THEN '可以出售'
ELSE '未知状态'
END
FROM Goods
2.选择表达式运用
SELECT Name AS GoodsName,
StorageStatus=
CASE
WHEN Storage=0 THEN '没有库存'
WHEN Storage<300 THEN '库存较少'
WHEN Storage>=300 AND Storage<1000 THEN '库存正常'
ELSE '库存过量'
END
FROM Goods
例如:打印一个局部变量@MyMsg
SET @MyMsg='This is my message.'
PRINT @MyMsg
SET @dbid =DB_ID()
DECLARE @dbname nvarchar(128)
SET @dbname=DB_NAME()
RAISERROR
('The current database ID is:%d,the database name is:%s.',16,1,@dbid,@dbname)
The current database ID is:7,the database name is:Market.
GO
DECLARE @dbid int
SET @dbid =DB_ID()
DECLARE @dbname nvarchar(128)
SET @dbname=DB_NAME()
RAISERROR
(5005,16,1,@dbid,@dbname)
返回:
The current database ID is:7,the database name is:Market.