使用 STRING_SPLIT() 表示您正在使用 SQL Server 2016(或更高版本)。
但是,STRING_SPLIT() 有一个很大的缺点:不能保证按预期顺序退回商品(请参阅docs, section "Remarks")。在我看来,这是一个绝对的表演终结者......
但是 - 幸运的是 - 在 v2016+ 中有一个快速且易于使用的解决方法:
Create table #temp(Sid int,roleid varchar(100))
Insert into #temp values(500,'1,5,'),(501,'1,5,6,');
SELECT t.[Sid]
,A.[key] AS position
,A.[value] AS roleid
FROM #temp t
CROSS APPLY OPENJSON(CONCAT('["',REPLACE(t.roleid,',','","'),'"]')) A
WHERE A.[value]<>'';
一个简单的数字数组 1,3,5 只需要括号就可以成为 JSON 数组 ([1,3,5])。在您的情况下,由于尾随逗号,我将其作为字符串处理。 1,3,5, 将被视为字符串数组:["1","3","5",""]。最后的空字符串被 WHERE 子句带走。剩下的就简单了……
除了STRING_SPLIT() docs 证明之外,OPENJSON 将反映项目在[key] 列中的位置:
当 OPENJSON 解析 JSON 数组时,该函数返回 JSON 文本中元素的索引作为键。
一般提示:避免将 STRING_SPLIT() 当作 lons,因为它的结果集中没有添加额外的键/位置列。