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!

¿Fue útil?

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:

http://www.sommarskog.se/arrays-in-sql.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top