T-SQL разбивает строку на отношения "многие к одному"?
-
11-09-2019 - |
Вопрос
У меня есть следующий 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.ИДЕНТИФИКАТОР и каждое значение, разделенное запятыми, в @test.данные разбиваются на свои собственные записи, а их значение помещается в поле DataItem.
Как я могу этого добиться?
Обязан ли я использовать курсоры?
Я вставил dbo.__StringSplit реализация табличной функции в http://pastebin.com/f7dd6350f
Спасибо!
Решение
В SQL2000 вам нужны курсоры.В SQL2005 /2008 вы можете использовать ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ satement;вероятно, как следующий (не могу протестировать прямо сейчас):
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S
Редактировать - Я нашел эта страница о ПЕРЕКРЕСТНОМ ПРИМЕНЕНИИ а потом придумал:
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
Что решило мою проблему :-)
Другие советы
ваша функция разделения строк работает очень медленно, вот ссылка, чтобы сделать ее намного быстрее: