2

私は次の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

そして、!Executeをクリックした後、私はこれらを取得しました:

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

非参加バージョンも試しましたが、同じエラーが発生しました。

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

..。

私が期待したのは、@ test.IDからのIDを持つテーブルを取得する必要があり、@ test.dataの各コンマ区切り値が独自のレコードに分割され、その値がdataItemフィールドに配置されることでした。

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

http://pastebin.com/f7dd6350fにdbo.__StringSplitテーブル値関数の実装を貼り付けました

ありがとう!

4

2 に答える 2

3

SQL2000では、カーソルが必要です。SQL2005 / 2008では、CROSSAPPLYsatementを使用できます。おそらく次のように(今はテストできません):

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

編集-私はCROSSAPPLYでこのページを見つけ、それから思いついた:

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

これで私の問題は解決しました:-)

于 2009-04-18T16:26:32.437 に答える
1

分割文字列関数は本当に遅いです。これは、はるかに高速な関数を作成するためのリンクです。

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

于 2009-04-20T21:55:56.420 に答える