T-SQL Разбить строку на отношение многие-к-одному? - PullRequest
2 голосов
/ 18 апреля 2009

У меня есть следующий сценарий 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

И после нажатия! Выполнить, я получил:

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, и каждое значение, разделенное запятыми в @ test.data, будет разбито на свои собственные записи, а его значение будет помещено в поле dataItem. .

Как мне это сделать?
Обязательно ли использовать курсоры?

Я вставил реализацию табличной функции dbo .__ StringSplit в http://pastebin.com/f7dd6350f

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 апреля 2009

В SQL2000 вам нужны курсоры. В SQL2005 / 2008 вы можете использовать функцию CROSS APPLY; вероятно, как следующий (не могу проверить только сейчас):

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

РЕДАКТИРОВАТЬ - я нашел эту страницу на 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

Что решило мою проблему: -)

1 голос
/ 21 апреля 2009

ваша функция разбиения строки очень медленная, вот ссылка, чтобы сделать ее намного быстрее:

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

...