MS SQL中如何为每个ArticleID高效批量插入指定多行GroupID数据
MS SQL 高效批量插入方案
不需要用循环、游标这类逐行处理的低效写法,直接用集合化的交叉连接(笛卡尔积)一次性生成所有待插入数据,单条语句即可完成,不管表内有多少条ArticleID都能高效执行,也不需要硬编码不固定的ArticleID值。
核心实现SQL
执行前将语句中的你的业务表名替换为实际表名即可:
INSERT INTO 你的业务表名 (ArticleID, GroupID) SELECT t.ArticleID, g.GroupID FROM 你的业务表名 t CROSS JOIN ( -- 待插入的固定GroupID集合,后续增减分组直接修改这里的取值即可 VALUES ('A'), ('B'), ('C'), ('D') ) AS g(GroupID) -- 只基于原有GroupID为NULL的基准行生成新数据,避免重复生成 WHERE t.GroupID IS NULL;
操作注意事项
- 执行前先做数据预检:把上面语句的
INSERT INTO部分去掉,直接执行SELECT段,先确认生成的待插入数据和预期一致,再执行插入操作:SELECT t.ArticleID, g.GroupID FROM 你的业务表名 t CROSS JOIN ( VALUES ('A'), ('B'), ('C'), ('D') ) AS g(GroupID) WHERE t.GroupID IS NULL ORDER BY t.ArticleID, g.GroupID; - 重复数据兜底处理:如果表中已经存在部分(ArticleID, GroupID)组合,或者两个字段建有联合唯一键,可以加
NOT EXISTS判断避免插入冲突:INSERT INTO 你的业务表名 (ArticleID, GroupID) SELECT t.ArticleID, g.GroupID FROM 你的业务表名 t CROSS JOIN ( VALUES ('A'), ('B'), ('C'), ('D') ) AS g(GroupID) WHERE t.GroupID IS NULL AND NOT EXISTS ( SELECT 1 FROM 你的业务表名 t2 WHERE t2.ArticleID = t.ArticleID AND t2.GroupID = g.GroupID ); - 后续扩展适配:如果固定GroupID集合需要频繁调整,可以把这组值单独存到一张配置表,把CROSS JOIN后的子查询替换成配置表查询即可,不需要修改核心插入逻辑。
避坑说明
以下写法不推荐使用:
- 不要用游标、WHILE循环逐ArticleID逐GroupID插入:逐行提交会产生大量事务日志,数据量超过千条后性能会急剧下降
- 不要硬编码所有ArticleID写长串
INSERT VALUES:当前场景下ArticleID取值不固定,硬编码完全不可维护,新增ArticleID就要修改SQL
内容的提问来源于stack exchange,提问作者pancufer
相关产品推荐
相关产品推荐

