Si vous avez besoin d'une solution ad-hoc rapide pour les cas courants avec un code minimum, alors ce double ligne CTE récursif le fera:
DECLARE @s VARCHAR(200) = ',1,2,,3,,,4,,,,5,'
;WITH
a AS (SELECT i=-1, j=0 UNION ALL SELECT j, CHARINDEX(',', @s, j + 1) FROM a WHERE j > i),
b AS (SELECT SUBSTRING(@s, i+1, IIF(j>0, j, LEN(@s)+1)-i-1) s FROM a WHERE i >= 0)
SELECT * FROM b
Utilisez-le comme une instruction autonome ou ajoutez simplement les CTE ci-dessus à l'une de vos requêtes et vous pourrez rejoindre la table résultante b
avec d'autres pour une utilisation dans d'autres expressions.
modifier (par Shnugo)
Si vous ajoutez un compteur, vous obtiendrez un index de position avec la liste:
DECLARE @s VARCHAR(200) = '1,2333,344,4'
;WITH
a AS (SELECT n=0, i=-1, j=0 UNION ALL SELECT n+1, j, CHARINDEX(',', @s, j+1) FROM a WHERE j > i),
b AS (SELECT n, SUBSTRING(@s, i+1, IIF(j>0, j, LEN(@s)+1)-i-1) s FROM a WHERE i >= 0)
SELECT * FROM b;
Le résultat:
n s
1 1
2 2333
3 344
4 4