流程控制与异常处理
这篇讲 T-SQL 的流程控制语句(BEGIN…END、IF…ELSE、CASE、WHILE、GOTO、WAITFOR)以及异常信息处理(sp_addmessage、RAISERROR)。
运算符优先顺序
在编写流程控制逻辑前,先明确运算符的完整优先顺序(从高到低):
+(正)、-(负)、~(按位 NOT)*(乘)、/(除)、%(模)+(加)、+(串联)、-(减)=、>、<、>=、<=、<>、!=、!>、!<(比较运算符)^(位异或)、&(位与)、|(位或)NOTANDALL、ANY、BETWEEN、IN、LIKE、OR、SOME=(赋值)
流程控制语句
| 语句 | 作用 |
|---|---|
BEGIN…END | 定义语句块 |
IF…ELSE | 定义条件及条件为假时的操作 |
CASE…WHEN…END | 多分支取值 |
WHILE | 条件为真时重复执行 |
GOTO label | 无条件跳转到 label 处继续执行 |
WAITFOR | 为语句执行设置延迟 |
BEGIN…END
将多个语句组合成一个语句块,作为一个单元处理,相当于一对括号。在条件、循环等控制流程中,当符合条件要执行多个语句时使用:
BEGIN
语句1
语句2
…
ENDIF…ELSE
条件判断语句,ELSE 子句可选,支持嵌套(无层数限制):
IF 逻辑表达式
BEGIN
语句块1
END
ELSE
BEGIN
语句块2
ENDCASE…WHEN…END
计算多个条件,返回第一个符合条件的结果表达式。注意:CASE 是表达式不是语句,不能单独执行,只能作为语句的一部分使用:
CASE 测试表达式
WHEN 测试值1 THEN 结果表达式1
WHEN 测试值2 THEN 结果表达式2
...
ELSE 结果表达式n
ENDWHILE
只要指定条件为真,就重复执行语句或语句块:
WHILE 布尔表达式
BEGIN
SQL 语句
-- BREAK : 完全跳出循环,结束 WHILE
-- CONTINUE : 跳过其后语句,回到 WHILE 第一行重新判断
ENDGOTO
无条件转移语句,直接跳到指定标号处执行,标号与 GOTO 之间的语句不会执行。可用在语句块、批处理和存储过程中:
GOTO 标号
...
标号: -- 标号可为数字与字符组合,必须以 ":" 结尾WAITFOR
延迟或暂停程序执行:
-- 等待一段时间后执行(延迟 3 秒)
WAITFOR DELAY '00:00:03'
SELECT * FROM Products
-- 等到指定时刻执行
WAITFOR TIME '11:47:30'
SELECT * FROM Products异常信息处理
处理异常可增强存储过程效率,返回事务状态(成功或失败)信息,并在事务处理前进行错误检查。
sp_addmessage 自定义错误信息
允许创建自定义错误信息,所有信息存储在 master 数据库的 sysmessages 表中:
EXEC sp_addmessage
@msgnum = 88888, -- 消息号(必须大于 50000)
@severity = 10, -- 级别
@msgtext = 'welcome to yinhe', -- 消息文本
@lang = 'english', -- 消息语言
@with_log = 'false', -- 是否写日志
@replace = 'replace' -- 是否强行替换已有消息号RAISERROR 抛出错误
返回用户定义的错误信息,并向 SQL Server Error Log 和 Windows 应用程序日志写错误信息:
-- RAISERROR(消息号, 安全级别, 状态)
RAISERROR(88888, 10, 1) -- 调用 88888 号自定义消息最后更新于