T-SQL Разбить строку на отношение многие-к-одному?
У меня есть следующий сценарий 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 ответа
В 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
Который решил мою проблему:-)
Ваша функция разделения строк очень медленная, вот ссылка, чтобы сделать ее намного быстрее: