SQL循环遍历列表批量插入列数据的问题求助(1000次迭代)
解决方案
问题分析
你当前的代码每次循环会把整个字符串'temp,humidity,dewpoint'插入到一行,且循环次数为1001次(@Counter <= 1000),完全不符合逐个元素循环插入的预期。另外错误提示无法插入NULL,大概率是执行时变量赋值异常,或是误操作了master系统库的表(不建议在系统库中存放业务数据)。
实现代码
方法一:WHILE循环(适合新手理解)
DECLARE @Counter INT = 1 -- 把要循环的元素存到表变量,带顺序编号 DECLARE @myList TABLE (Val VARCHAR(50), Seq INT) INSERT INTO @myList (Val, Seq) VALUES ('temp', 1), ('humidity', 2), ('dewpoint', 3) WHILE @Counter <= 1000 BEGIN -- 通过取模运算循环获取列表元素 INSERT INTO [DBO].[tbl_var] (VariableNames) SELECT Val FROM @myList WHERE Seq = ((@Counter - 1) % 3) + 1 SET @Counter = @Counter + 1 END
方法二:集合式插入(更高效,推荐)
SQL是面向集合的语言,用CTE生成1000行数据并关联列表元素,一次性插入比循环效率高很多:
WITH Numbers AS ( -- 生成1到1000的连续数字 SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Num FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2 ), MyList AS ( -- 定义要循环的元素及顺序 SELECT 'temp' AS Val, 1 AS Seq UNION ALL SELECT 'humidity', 2 UNION ALL SELECT 'dewpoint', 3 ) INSERT INTO [DBO].[tbl_var] (VariableNames) SELECT ml.Val FROM Numbers n JOIN MyList ml ON ml.Seq = ((n.Num - 1) % 3) + 1
关键说明
- 两种方法都通过
((序号-1) % 元素数量) + 1的取模逻辑,实现列表元素的循环复用。 - 确保操作的是业务数据库中的
tbl_var表,而非master系统库,避免权限或数据混乱问题。
内容的提问来源于stack exchange,提问作者user19975572
相关产品推荐
相关产品推荐

