You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:00:54