跳至内容
流程控制与异常处理

流程控制与异常处理

这篇讲 T-SQL 的流程控制语句(BEGIN…END、IF…ELSE、CASE、WHILE、GOTO、WAITFOR)以及异常信息处理(sp_addmessage、RAISERROR)。

运算符优先顺序

在编写流程控制逻辑前,先明确运算符的完整优先顺序(从高到低):

  1. +(正)、-(负)、~(按位 NOT)
  2. *(乘)、/(除)、%(模)
  3. +(加)、+(串联)、-(减)
  4. =><>=<=<>!=!>!<(比较运算符)
  5. ^(位异或)、&(位与)、|(位或)
  6. NOT
  7. AND
  8. ALLANYBETWEENINLIKEORSOME
  9. =(赋值)

流程控制语句

语句作用
BEGIN…END定义语句块
IF…ELSE定义条件及条件为假时的操作
CASE…WHEN…END多分支取值
WHILE条件为真时重复执行
GOTO label无条件跳转到 label 处继续执行
WAITFOR为语句执行设置延迟

BEGIN…END

将多个语句组合成一个语句块,作为一个单元处理,相当于一对括号。在条件、循环等控制流程中,当符合条件要执行多个语句时使用:

BEGIN
    语句1
    语句2
    
END

IF…ELSE

条件判断语句,ELSE 子句可选,支持嵌套(无层数限制):

IF 逻辑表达式
BEGIN
    语句块1
END
ELSE
BEGIN
    语句块2
END

CASE…WHEN…END

计算多个条件,返回第一个符合条件的结果表达式。注意:CASE 是表达式不是语句,不能单独执行,只能作为语句的一部分使用:

CASE 测试表达式
    WHEN 测试值1 THEN 结果表达式1
    WHEN 测试值2 THEN 结果表达式2
    ...
    ELSE 结果表达式n
END

WHILE

只要指定条件为真,就重复执行语句或语句块:

WHILE 布尔表达式
BEGIN
    SQL 语句
    -- BREAK    : 完全跳出循环,结束 WHILE
    -- CONTINUE : 跳过其后语句,回到 WHILE 第一行重新判断
END

GOTO

无条件转移语句,直接跳到指定标号处执行,标号与 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 号自定义消息
最后更新于