在 SQL Server 的日常开发与数据库维护中,我们经常遇到这样一种场景:需要根据不同的条件,将数据库表中某一列的值修改为多个不同的值,将用户表中的“性别”字段从 'M'/'F' 批量转换为 'Male'/'Female',或者根据部门代码将“部门名称”批量替换。
如果在应用程序层循环执行 UPDATE 语句,效率低下且容易出错,在 SQL Server 中,有几种非常高效的方法可以实现这一需求,本文将详细介绍三种最常用的批量更新技巧。
使用 CASE WHEN 语句(条件替换)
这是最通用且最灵活的方法,当你需要根据原值的不同情况,映射到不同的新值时,CASE WHEN 是首选。

语法结构:
UPDATE 表名
SET 字段名 = CASE
WHEN 条件1 THEN 值1
WHEN 条件2 THEN 值2
ELSE 原值
END
WHERE 条件;
实战示例:
假设我们有一个 Users 表,Gender(性别)字段存储的是 'M' 和 'F',我们需要将其转换为全称 'Male' 和 'Female'。
UPDATE Users
SET Gender = CASE
WHEN Gender = 'M' THEN 'Male'
WHEN Gender = 'F' THEN 'Female'
ELSE Gender -- 处理其他未知情况
END;
优点: 逻辑清晰,支持复杂的条件判断,不仅限于简单的等值替换。
使用 IN 关键字(批量等值替换)
如果你只需要将一个字段中包含特定值(如 'A', 'B', 'C')的行,统一修改为另一个固定的值,使用 IN 子句是最简洁的方式。
语法结构:
UPDATE 表名 SET 字段名 = 新值 WHERE 字段名 IN (值1, 值2, 值3, ...);
实战示例: 假设我们需要将所有属于旧系统的部门 ID(1, 2, 3)统一更新为新的部门 ID '100'。
UPDATE Employees
SET DepartmentID = '100'
WHERE DepartmentID IN ('1', '2', '3');
优点: 代码极其简短,执行速度快,适合处理固定的、离散的值集合。
使用 VALUES 子句或 CTE(基于外部数据的批量更新)
我们需要更新的值不是固定的,而是来自于另一张表或一个临时列表,我们需要根据用户 ID 将 UserName 更新为从 UserMap 表中查到的名称。
这时,可以使用 VALUES 子句构造临时数据集,或者使用公用表表达式(CTE)。
实战示例(使用 CTE):
WITH UpdateData AS (
SELECT ID, NewName FROM UserMappingTable WHERE IsActive = 1
)
UPDATE t
SET t.UserName = u.NewName
FROM Users t
JOIN UpdateData u ON t.ID = u.ID;
文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

