用 RAISERROR 抛出自定义错误
📝 微软官方推荐新项目优先使用
throw
,因为它行为更一致、更简单、更贴近编程语言(如 Java、JS 等)的异常处理习惯。
raiserror
(注意:SQL Server 从 2012 起推荐使用 throw
)是 T-SQL(Transact-SQL)的「关键字」,用于生成自定义错误,但不一定中断当前 T-SQL 语句批处理(Batch)的执行。
- Batch(批处理单元): 一次性提交到 SQL Server 的一组 T-SQL 语句,它的边界由
go
分隔- 在 SSMS(SQL Server Management Studio)、sqlcmd(SQL Server 命令行工具)、 IntelliJ IDEA 的 Database Plugin 等工具中,
go
用于分隔 Batch - 每个 Batch 包含从上一个
go
(或脚本开头)到下一个go
(或脚本结尾)之间的所有 T-SQL 语句 - 如果没有
go
,整个脚本被视为单个 Batch
- 在 SSMS(SQL Server Management Studio)、sqlcmd(SQL Server 命令行工具)、 IntelliJ IDEA 的 Database Plugin 等工具中,
go
(批处理分隔符):SQL Server 相关工具的批处理分隔符,不属于 SQL 语言本身,也不是数据库引擎识别的语法或语句,常用于分隔无法在同一 Batch 中执行的 SQL- 🚨 存储过程、函数、触发器、视图等对象的定义语句,必须放在独立的 Batch 中,即需出现在上一个
go
之后(或脚本开头),并以go
结束(或脚本结尾) - 批处理级作用域:所有在
go
之前声明的局部变量、临时表或上下文信息,仅在当前批次有效;一旦脚本执行遇到go
,这些对象的作用域即被终止,后续批次将无法访问 - 注意与分号的区别:
;
仅作「同批次语句」分隔符,go
则是「批处理」分界符
- 🚨 存储过程、函数、触发器、视图等对象的定义语句,必须放在独立的 Batch 中,即需出现在上一个
raiserror
之后通常用空格分隔参数,但其实也允许直接写括号,例如:
1-- 这两种写法都合法
2raiserror ('错误', 16, 1); -- 👍 推荐
3raiserror('错误', 16, 1);
- 空格不是为了语法上的区分函数调用,而是 SQL 语言风格使然——关键字后面常用空格,函数调用则紧连括号
- 👍 推荐按官方习惯在
raiserror
后面加空格,可读性高,也符合行业标准
SQL Server 中
raiserror
的自定义错误抛出,规范参数为 Severity 16(常规用户级错误)、State 1(默认状态码),已成为业界通用做法。
⚠️ 注意:raiserror ('错误', 16, 1)
后面的代码确实还会继续执行,这是 T-SQL 的标准行为:除非是 严重级别 ≥ 20
,否则 raiserror
只是抛出一个错误消息,不会自动终止当前批处理或存储过程,需要手动使用 return
或 throw
来中断执行。