T-SQL Divide una cadena en muchos-a-uno?
-
11-09-2019 - |
Pregunta
Tengo la siguiente secuencia de comandos SQL:
DECLARE @temp table (
ID int IDENTITY(1, 1),
data nvarchar(100)
)
INSERT INTO @temp (data) VALUES ('a,b,c')
INSERT INTO @temp (data) VALUES ('d,e,f')
SELECT *
FROM @temp AS T
INNER JOIN
(SELECT *
FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S
ON T.ID = S.RefID
! Y después de hacer clic en Ejecutar, tengo los siguientes:
Line 17 The multi-part identifier "T.data" could not be bound.
También he probado la versión no unirse y consiguió el mismo error:
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID
...
Lo que esperaba era que yo debería obtiene una tabla con los ID procedentes de @ test.ID y cada uno de los valores separados por comas en test.data @ consigue dividido en sus propios registros y su valor puesto en el campo dataItem .
¿Cómo puedo lograr eso?
¿Es obligatorio el uso de punteros?
He pegado el dbo .__ StringSplit aplicación con valores de tabla de funciones en http://pastebin.com/f7dd6350f
Gracias!
Solución
En SQL2000 necesita cursores. En SQL2005 / 2008, puede utilizar CROSS APPLY satement; probablemente como siguiente (no se puede comprobar hasta ahora):
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S
Editar - He encontrado esta página en CROSS APPLY y luego se le ocurrió:
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T
CROSS APPLY
dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID
¿Qué resolvió mi problema: -)
Otros consejos
su función de cadena de división es muy lento, aquí hay un enlace para hacer una mucho más rápido uno: