个人技术站点JASONWU

Keep Coding


  • 主页

  • 文章

  • 搜索

SQL Server 异常处理:自定义错误、事务管理

新建: 2025-08-06 编辑: 2025-08-09   |   分类: 后端开发   | 字数: 3854 字

用 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
  • go(批处理分隔符):SQL Server 相关工具的批处理分隔符,不属于 SQL 语言本身,也不是数据库引擎识别的语法或语句,常用于分隔无法在同一 Batch 中执行的 SQL
    • 🚨 存储过程、函数、触发器、视图等对象的定义语句,必须放在独立的 Batch 中,即需出现在上一个 go 之后(或脚本开头),并以 go 结束(或脚本结尾)
    • 批处理级作用域:所有在 go 之前声明的局部变量、临时表或上下文信息,仅在当前批次有效;一旦脚本执行遇到 go,这些对象的作用域即被终止,后续批次将无法访问
    • 注意与分号的区别:; 仅作「同批次语句」分隔符,go 则是「批处理」分界符

raiserror 之后通常用空格分隔参数,但其实也允许直接写括号,例如:

SQL
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 来中断执行。

阅读全文 »

SQL Server:COALESCE 和 ISNULL 的坑与最佳实践

新建: 2025-08-09 编辑: 2025-08-09   |   分类: 后端开发   | 字数: 989 字

关键差异:isnull 使用第一个参数的数据类型;coalesce 按 case 规则返回「最高优先级」的数据类型。

下面用一组可直接运行的 T‑SQL 示例,展示 isnull 因「结果类型取决于第一个参数的数据类型」,从而导致的隐式截断、类型不符的问题,并给出等价的 coalesce 或显式 cast 规避方式。

1. 值被截断

SQL
 1-- 演示:C1 比较短(varchar(6)),C2 较长(varchar(15))
 2create table #WXJ (C1 varchar(6), C2 varchar(15));
 3insert into #WXJ values (null, '12三四五六');
 4
 5-- ISNULL:结果类型取第一个参数(C1)的类型与长度 => 截断为 6 个字节
 6select C1, C2, isnull(C1, C2) as bad_data -- 仅返回 '12三四'
 7from #WXJ;
 8
 9-- 两种修复:
10-- A) 显式扩宽第一个参数,让结果类型足够长
11select C1, C2, isnull(convert(varchar(15), C1), C2) as good_data
12from #WXJ;
13
14-- B) 用 coalesce(按 case 规则推断,避免被第一个参数长度限制)
15select C1, C2, coalesce(C1, C2) as good_data
16from #WXJ;
17
18drop table #WXJ;
阅读全文 »

SQL Server 变量声明与赋值

新建: 2025-08-06 编辑: 2025-08-09   |   分类: 后端开发   | 字数: 1102 字

声明并赋值语法

在 SQL Server 中,declare 和 set 语句用于声明变量并为其赋值,可以用一行「声明并赋值」语句来完成。

SQL
1-- 在声明时直接赋值,但这种写法只支持返回一行数据
2declare @test_id int = (select test_id from dbo.WXJ_TEST where test_code = @test_code);

⚠️ 注意:若 select 查询结果为多行,此写法会报错!

阅读全文 »

SQL Server 字段级恢复:基于主键的备份表关联方法

新建: 2025-08-07 编辑: 2025-08-07   |   分类: 后端开发   | 字数: 714 字

在 SQL Server 中,通过关联(主键或其他唯一键)备份表进行字段级恢复,是业界最佳实践之一,尤其针对需要精细恢复部分字段(而非整表插入)的场景。

这种方式能够最大限度地减少对现有数据的影响,避免全表清空或覆盖,只修正有问题的字段和记录。

  • 高精度:仅影响需要修复的字段和行,风险最小
  • 高性能:只更新需要的数据,尤其适合大型数据库或高并发环境
  • 易于回滚:可配合事务(begin tran/commit/rollback)操作,增强安全性
  • 适用范围广:可通过 where 条件灵活过滤,支持批量或个别字段恢复
阅读全文 »

Bash 命令行提效

新建: 2025-07-28 编辑: 2025-08-07   |   分类: DevOps   | 字数: 3114 字

终端快捷键

操作快捷键
跳到行首Ctrl + A
跳到行尾Ctrl + E
向前一个字符Ctrl + F / →
向后一个字符Ctrl + B / ←
向前一个单词Alt + F
向后一个单词Alt + B
删除到行首Ctrl + U
删除到行尾Ctrl + K
删除光标前一个单词Ctrl + W
删除光标后一个单词Alt + D
删除光标所在字符Ctrl + D
粘贴上次删除内容Ctrl + Y
撤销操作Ctrl + _
上一条历史命令Ctrl + P / ↑
下一条历史命令Ctrl + N / ↓
清屏Ctrl + L
快速参数补全Tab
阅读全文 »
1 2 3 4 5 6
吴仙杰

吴仙杰

🔍 Ctrl+K / ⌘K

27 文章
9 分类
25 标签
RSS 订阅
邮箱 GitHub
© 2021-2025 吴仙杰 保留所有权利 All Rights Reserved
浙公网安备 33010302003726号 浙ICP备2021017187号-1
0%