SQL Server 2019从备份表恢复主表缺失字段值的方法
SQL Server批量从备份表恢复主表NULL字段
正确的批量更新脚本
UPDATE p SET p.Col1 = ISNULL(p.Col1, a.Col1), p.Col2 = ISNULL(p.Col2, a.Col2), p.Col3 = ISNULL(p.Col3, a.Col3), p.Col4 = ISNULL(p.Col4, a.Col4), p.Col5 = ISNULL(p.Col5, a.Col5), p.Col6 = ISNULL(p.Col6, a.Col6) FROM Reps p INNER JOIN Deleted a ON p.ID = a.ID -- 可选:过滤出至少有一个NULL字段的行,避免无意义更新 WHERE p.Col1 IS NULL OR p.Col2 IS NULL OR p.Col3 IS NULL OR p.Col4 IS NULL OR p.Col5 IS NULL OR p.Col6 IS NULL
你之前批量写法失效的原因
注释里的ISNULL逻辑本身没问题,大概率是执行时的语法疏漏:
- 检查每个字段赋值语句末尾是否加了逗号(比如
p.Col1 = ISNULL(...)后面必须有逗号,最后一个字段除外) - 不需要为每个字段单独加
a.ColX IS NOT NULL AND p.ColX IS NULL的条件,ISNULL会自动判断:仅当主表字段为NULL时,才用备份表的值替换,否则保留主表原值。
脚本逻辑说明
- 通过
INNER JOIN按ID匹配主表和备份表的同一数据行 ISNULL(p.ColX, a.ColX)实现:主表字段非NULL则保留,为NULL则用备份表对应值填充- 可选的WHERE子句能减少不必要的更新,只处理存在NULL字段的行
针对你的示例数据的效果
执行脚本后:
- ID=1的
Col3、ID=2的Col5、ID=4的Col1会被备份表对应值替换 - ID=3无需要修改的NULL字段,不会被更新
内容的提问来源于stack exchange,提问作者user466663
相关产品推荐
相关产品推荐

