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

在TSQL中如何使用表中数据填充数组?现有循环赋值逻辑报错如何解决

错误原因

  • TSQL 没有原生数组类型,你声明的@oArray是varchar字符串类型,不支持@oArray(@Counter)这种下标式的赋值语法,这是运行报错的直接原因。
  • 你的循环逻辑里没有对@Counter做自增操作,就算数组语法成立,也会陷入死循环。

实现方案

方案1:表变量模拟数组(最贴近你要的下标访问逻辑)

用表变量存储序号和对应的值,完全可以满足你用@Counter同时匹配下标和行号的需求,而且不需要硬编码数值:

/* 声明模拟数组的表变量,ArrayIndex列对应下标,ArrayValue列存储你要的z值 */
DECLARE @oArray TABLE (
    ArrayIndex INT,
    ArrayValue VARCHAR(255) -- 这里长度根据你的z字段实际长度调整
)
DECLARE @Counter INT = 1
DECLARE @rows INT 

/* 先统计符合条件的行数 */
SET @rows = (SELECT COUNT(z) FROM z WHERE z like 'z-%' and z = 1)

WHILE (@Counter <= @rows)
BEGIN
    INSERT INTO @oArray(ArrayIndex, ArrayValue)
    SELECT @Counter, z 
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY z ASC) AS RowNumber,*
        FROM z WHERE z like 'z-%' and z = 1
    ) AS taboo
    WHERE RowNumber = @Counter
    /* 不要忘了计数器自增,否则会死循环 */
    SET @Counter = @Counter + 1
END

/* 后续使用可以直接通过下标查询,比如取第3个值 */
SELECT ArrayValue FROM @oArray WHERE ArrayIndex = 3

更优化的写法是不需要循环,直接批量插入,性能更高:

DECLARE @oArray TABLE (
    ArrayIndex INT,
    ArrayValue VARCHAR(255)
)

INSERT INTO @oArray(ArrayIndex, ArrayValue)
SELECT RowNumber, z 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY z ASC) AS RowNumber, z
    FROM z WHERE z like 'z-%' and z = 1
) AS taboo

方案2:如果需要拼接成分隔字符串使用

如果你的后续计算只需要把符合条件的z值用分隔符拼接成一个字符串,可以直接用STRING_AGG(SQL Server 2017及以上版本支持),代码更简洁:

DECLARE @oArray VARCHAR(MAX)
SELECT @oArray = STRING_AGG(z, ',') WITHIN GROUP (ORDER BY z ASC)
FROM z WHERE z like 'z-%' and z = 1

如果是SQL Server 2016及以下版本,用以下方式拼接字符串:

DECLARE @oArray VARCHAR(MAX) = ''
SELECT @oArray = @oArray + z + ','
FROM z WHERE z like 'z-%' and z = 1
ORDER BY z ASC
/* 去掉末尾多余的分隔符 */
SET @oArray = LEFT(@oArray, LEN(@oArray)-1)

内容的提问来源于stack exchange,提问作者nooneclose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:24:02