Domanda

Ho il seguente script 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

E sul dopo aver fatto clic Esegui, ho ottenuto questi:

Line 17 The multi-part identifier "T.data" could not be bound.

Ho anche provato la non-join versione ed ha ottenuto lo stesso errore:

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID

...

Quello che mi aspettavo era che avrei dovuto ottiene una tabella con gli ID provenienti da @ test.ID e ciascuno valori separati da virgole in @ test.data ottiene suddiviso nelle proprie registrazioni e il suo valore messo in campo dataItem .

Come posso realizzare questo?
Sono tenuto a utilizzare i cursori?

Ho incollato il dbo .__ StringSplit implementazione con valori di tabella-funzione in http://pastebin.com/f7dd6350f

Grazie!

È stato utile?

Soluzione

In SQL2000 è necessario cursori. Nel SQL2005 / 2008, è possibile utilizzare CROSS APPLY Satement; probabilmente come prossimo (non si può provare solo ora):

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S

Modifica - Ho trovato questa pagina su CROSS APPLY e poi si avvicinò con:

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

che ha risolto il mio problema: -)

Altri suggerimenti

la funzione stringa divisa è molto lento, Questo è il link per fare una molto più veloce uno:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top