如何用前10条记录的模式更新表NULL行(类似Excel填充柄)
解决方法
首先明确你原代码的两个问题:
- 声明的
@name是单个字符串变量,无法存储select distinct name返回的多个值,这是报错的直接原因 UPDATE语句的WHERE条件写反了,你要更新的是name IS NULL的行,而非IS NOT NULL的行
要实现用前10行的name循环填充NULL行的需求,可以借助CTE(公共表表达式)和窗口函数完成,具体代码如下:
-- 提取前10个非NULL的name并生成序号 WITH Top10Names AS ( SELECT name, ROW_NUMBER() OVER (ORDER BY id) AS rn -- 请替换成你表中的实际排序字段(比如主键),确保前10行顺序固定 FROM #temp WHERE name IS NOT NULL ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY ), -- 给所有需要更新的NULL行生成连续序号 TargetRows AS ( SELECT id, -- 替换成你表中的唯一标识字段,用于精准关联 ROW_NUMBER() OVER (ORDER BY id) AS rn FROM #temp WHERE name IS NULL ) UPDATE t SET t.name = tn.name FROM #temp t JOIN TargetRows tr ON t.id = tr.id JOIN Top10Names tn ON tn.rn = ((tr.rn - 1) % 10) + 1;
代码说明:
- Top10Names:从
#temp中取出前10个非NULL的name,为每个name分配1到10的序号rn。这里的ORDER BY id建议替换成表中实际排序字段(如主键),保证前10行顺序固定,避免随机排序导致填充模式混乱。 - TargetRows:给所有
name为NULL的行分配连续序号(1、2、3...),同样用唯一标识字段排序,确保更新顺序可预期。 - 关联更新:通过
((tr.rn - 1) % 10) + 1让NULL行的序号循环对应1-10,实现前10个name的重复填充(第11个NULL行对应第1个name,第12个对应第2个,以此类推)。
如果你的表没有唯一标识字段,也可以用ORDER BY (SELECT NULL)临时排序,但这种方式的顺序不确定,建议优先使用表中已有的排序字段。
内容的提问来源于stack exchange,提问作者Marshal
相关产品推荐
相关产品推荐

