Le problème vient de votre fonction split. Il fait la scission dans un RBAR mode. Vous devez utiliser un séparateur basé sur un ensemble. Voici le DelimitedSplit8k par Jeff Moden, qui est l'un des séparateurs les plus rapides :
CREATE FUNCTION [dbo].[DelimitedSplit8K](
@pString VARCHAR(8000), @pDelimiter CHAR(1)
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)
,E2(N) AS (SELECT 1 FROM E1 a, E1 b)
,E4(N) AS (SELECT 1 FROM E2 a, E2 b)
,cteTally(N) AS(
SELECT TOP (ISNULL(DATALENGTH(@pString), 0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
,cteStart(N1) AS(
SELECT 1 UNION ALL
SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString, t.N, 1) = @pDelimiter
),
cteLen(N1, L1) AS(
SELECT
s.N1,
ISNULL(NULLIF(CHARINDEX(@pDelimiter, @pString, s.N1),0) - s.N1, 8000)
FROM cteStart s
)
SELECT
ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l
Remarque :Assurez-vous de consulter l'article pour la fonction mise à jour
Pour plus de fonctions fractionnées, lisez ces articles de Sir Aaron Bertrand :
- Séparez les chaînes dans le bon sens, ou mieux chemin
- Splitting Strings :A Follow-Up
- Séparer les chaînes :désormais avec moins de T-SQL
- Comparaison des méthodes de fractionnement/concaténation de chaînes
- Traitement d'une liste d'entiers :mon approche
- Diviser une liste d'entiers :un autre tour d'horizon
- En savoir plus sur le fractionnement des listes :délimiteurs personnalisés, prévention des doublons et maintien de l'ordre
- Suppression des doublons des chaînes dans Serveur SQL