SQL Server中拼接两列同位置逗号分隔的Errorcode与ErrorDescription字段值
SQL Server 逗号分隔多值字段对应拼接实现方案
需求说明
现有数据表包含3个字段:
Id:数据唯一标识Errorcode:存储逗号分隔的多组错误码ErrorDescription:存储逗号分隔的多组错误描述,与Errorcode的取值位置一一对应
需要将对应位置的错误码、错误描述按错误码-错误描述格式拼接,多组拼接结果用, (逗号加空格)分隔,最终输出Id与合并后的Error字段。
实现方案
注意:如果单条数据的
Errorcode与ErrorDescription分隔后的数量不一致,仅会返回两者数量最小值对应的拼接结果。
适用版本:SQL Server 2016 及以上(支持JSON函数)
该方案通过JSON转换实现带顺序的字符串拆分,可保证错误码与错误描述的位置匹配正确。
-- 1. 测试样例数据,可替换为实际业务表 WITH TestTable AS ( SELECT 1 AS Id, '204,201,33' AS Errorcode, 'Invalid Object,Out Of Range,Invalid Format' AS ErrorDescription UNION ALL SELECT 2 AS Id, '21,44' AS Errorcode, 'FileInvalid,Invalid date' AS ErrorDescription UNION ALL SELECT 3 AS Id, '20' AS Errorcode, 'Invalid parse' AS ErrorDescription ) -- 2. 核心查询逻辑 SELECT t.Id, STRING_AGG(CONCAT(c.value, '-', d.value), ', ') AS Error FROM TestTable t -- 拆分Errorcode,JSON转换后key字段即为拆分顺序索引 CROSS APPLY OPENJSON(CONCAT('["', REPLACE(t.Errorcode, ',', '","'), '"]')) c -- 拆分ErrorDescription,按索引匹配对应错误描述 CROSS APPLY OPENJSON(CONCAT('["', REPLACE(t.ErrorDescription, ',', '","'), '"]')) d WHERE c.[key] = d.[key] GROUP BY t.Id
适用版本:SQL Server 2022 及以上(支持STRING_SPLIT序号参数)
可直接用STRING_SPLIT的enable_ordinal参数获取拆分后值的位置,写法更简洁:
WITH TestTable AS ( SELECT 1 AS Id, '204,201,33' AS Errorcode, 'Invalid Object,Out Of Range,Invalid Format' AS ErrorDescription UNION ALL SELECT 2 AS Id, '21,44' AS Errorcode, 'FileInvalid,Invalid date' AS ErrorDescription UNION ALL SELECT 3 AS Id, '20' AS Errorcode, 'Invalid parse' AS ErrorDescription ) SELECT t.Id, STRING_AGG(CONCAT(c.value, '-', d.value), ', ') AS Error FROM TestTable t CROSS APPLY STRING_SPLIT(t.Errorcode, ',', 1) c CROSS APPLY STRING_SPLIT(t.ErrorDescription, ',', 1) d WHERE c.ordinal = d.ordinal GROUP BY t.Id
输出结果
| Id | Error |
|---|---|
| 1 | 204-Invalid Object, 201-Out Of Range, 33-Invalid Format |
| 2 | 21-FileInvalid, 44-Invalid date |
| 3 | 20-Invalid parse |
内容的提问来源于stack exchange,提问作者Imran Kadri
相关产品推荐
相关产品推荐

