El problema es con su función de división. Está haciendo la división en un RBAR Moda. Debe usar un divisor basado en conjuntos. Aquí está el DelimitedSplit8k de Jeff Moden, que es uno de los divisores más rápidos que existen:
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
Nota:asegúrese de buscar en el artículo la función actualizada
Para conocer más funciones divididas, lea estos artículos de Sir Aaron Bertrand:
- Dividir cadenas de la manera correcta, o la siguiente mejor camino
- Dividir cadenas:un seguimiento
- División de cadenas:ahora con menos T-SQL
- Comparación de métodos de concatenación/división de cadenas
- Procesando una lista de enteros:mi enfoque
- Dividir una lista de enteros:otro resumen
- Más información sobre la división de listas:delimitadores personalizados, prevención de duplicados y mantenimiento del orden
- Eliminar duplicados de cadenas en Servidor SQL