T-SQL разбивает строку на отношения "многие к одному"?

StackOverflow https://stackoverflow.com/questions/763669

Вопрос

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top