Cela fonctionne pour les chaînes qui sont exclusivement des virgules ou qui ont jusqu'à 398 virgules contiguës.
SELECT
CASE
WHEN TargetString NOT LIKE '%[^,]%'
THEN '' /*The string is exclusively commas*/
ELSE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TargetString,
REPLICATE(',',16),','), /*399/16 = 24 remainder 15*/
REPLICATE(',',8),','), /* 39/ 8 = 4 remainder 7*/
REPLICATE(',',4),','), /* 11/ 4 = 2 remainder 3*/
REPLICATE(',',2),','), /* 5/ 2 = 2 remainder 1*/
REPLICATE(',',2),',') /* 3/ 2 = 1 remainder 1*/
END
FROM T
Ajoutez des puissances supplémentaires de 2 en haut si vous avez besoin de plus ou retirez du haut si vous en avez besoin de moins. Les commentaires de chaque étape indiquent le plus petit nombre que cette étape ne traitera pas avec succès.
Toutes les lignes de commentaires sont dans ce format
/* L/D = Q remainder R */
D: Corresponds to the length of the string generated by `REPLICATE`
R: Is always D-1
Q+R: Form L for the next step
Donc pour étendre la série vers le haut avec un autre REPLICATE(',',32),',')
étape
D = 32
R = 31
Q = 368 (399-31)
L = (368 * 32) + 31 = 11807
Cela traiterait donc des sections de virgules jusqu'à 11 806 caractères.