Использование STRING_SPLIT()
означает, что вы работаете на SQL Server 2016 (на порядок выше).
Однако, STRING_SPLIT()
имеет огромный недостаток: возврат гарантированных предметов не гарантирован. ожидаемый порядок (см. документы, раздел «Примечания» ). На мой взгляд, это абсолютный ограничитель шоу ...
Но - к счастью - в 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()
документов доказательство того, что OPENJSON
будет отражать позицию элемента в столбце [key]
:
Когда OPEN JSON анализирует массив JSON, функция возвращает индексы элементов в тексте JSON в качестве ключей.
Общая подсказка: избегайте STRING_SPLIT()
как lons поскольку в его результирующий набор не добавлен дополнительный столбец ключа / позиции.