2009-04-18 5 views
2

私は、次のSQLスクリプトがあります!T-SQL多対1の関係に文字列を分割しますか?

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

は、私はまた、非加入のバージョンを試してみましたが、同じエラーを得た:クリックした後

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 

そして上を実行し、私はこれらが得た

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私が期待していたのは、@ test.IDのIDを持つテーブルを取得し、@ test.dataの各カンマ区切りの値をそれぞれのレコードに分割し、その値をdataItemフィールドに入れることでした。

どうすれば実現できますか?
カーソルを使用する必要がありますか?

は私がhttp://pastebin.com/f7dd6350f

おかげでDBO .__ StringSplitテーブル値関数の実装を貼り付けました!

+0

あなたはまだクロス適用を使用しますが、スプリット文字列関数を私の答えのリンクから置き換えます。 –

答えて

3

SQL2000では、カーソルが必要です。 SQL2005/2008では、CROSS APPLY satementを使用できます。おそらく(ちょうど今テストすることはできません)、次のように:

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

EDIT - 私はthis page on CROSS APPLYを見つけ、その後、思い付いた:

:-)私の問題を解決し

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 

+0

CROSS APPLYは魅力的に機能しました!ありがとう! – chakrit

関連する問題