SQL Server中仅单字段值变化的批量插入如何无需重复写语句
SQL Server 批量插入实现方案
你这种固定列+单动态列的批量插入场景,优先推荐不用循环的单语句方案,性能更高,实现更简单:
方案1:行值构造器批量插入(推荐)
SQL Server 2008及以上版本支持行值构造器语法,直接把所有colD的取值放到VALUES列表里即可,一次完成所有插入:
INSERT INTO sao.feature (colA, colB, colC, colD, colE) SELECT '16.11.2021', '149', '79', colD_val, '3' FROM ( -- 此处补充所有需要插入的colD取值即可 VALUES (225), (226), (320), (15200), (120), (5) ) AS d(colD_val);
方案2:值列表存储+遍历实现
如果你的colD取值需要动态维护、或者数量超过1000行(单VALUES列表最多支持1000行),可以用表变量存储取值后遍历:
-- 声明表变量存储所有colD取值,SQL Server无原生数组类型,用表变量替代 DECLARE @ColDValues TABLE ( val INT ); -- 插入所有需要的colD值 INSERT INTO @ColDValues(val) VALUES (225), (226), (320), (15200), (120), (5); -- 遍历插入 DECLARE @currVal INT; DECLARE cur_colD CURSOR FOR SELECT val FROM @ColDValues; OPEN cur_colD; FETCH NEXT FROM cur_colD INTO @currVal; WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO sao.feature (colA, colB, colC, colD, colE) VALUES ('16.11.2021', '149', '79', @currVal, '3'); FETCH NEXT FROM cur_colD INTO @currVal; END CLOSE cur_colD; DEALLOCATE cur_colD;
说明
- 你最初的自增循环逻辑只适合colD为连续整数的场景,当前你的取值是非连续的,不适用这种逻辑。
- 如果colD是字符串类型,需要给所有取值加上单引号。
内容的提问来源于stack exchange,提问作者Hopper
相关产品推荐
相关产品推荐

