2009-04-18 5 views
2

Ich habe den folgenden SQL-Skript:T-SQL Split-String in Viele-zu-Eins-Beziehung?

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 

Und nach dem Klicken auf Ausführen, ich habe diese:

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

Ich habe auch die Nicht-Join-Version versucht und bekam den gleichen Fehler:

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

...

W Ich hatte erwartet, dass ich eine Tabelle mit IDs bekommen sollte, die von @ test.ID kommen, und jede kommagetrennte Variable in @ test.data wird in ihre eigenen Datensätze aufgeteilt und ihr Wert in das dataItem Feld geschrieben.

Wie kann ich das erreichen?
Muss ich Cursor verwenden?

Ich habe die dbo .__ Stringtabellenwertfunktion Implementierung bei http://pastebin.com/f7dd6350f

Dank geklebt!

+0

Sie werden immer noch das Kreuz anwenden, aber ersetzen Sie die Split-String-Funktion mit einem von dem Link in meiner Antwort. –

Antwort

3

In SQL2000 benötigen Sie Cursor. In SQL2005/2008 können Sie CROSS APPLY-Anweisung verwenden. wahrscheinlich wie weiter (nicht gerade testen Sie jetzt):

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

EDIT - ich this page on CROSS APPLY gefunden und dann kam mit:

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 

Welche mein Problem gelöst :-)

+0

CROSS APPLY arbeitete wie ein Charme! Vielen Dank! – chakrit