在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
相关产品推荐
相关产品推荐

