Как использовать CROSS APPLY XML PATH

Как я могу использовать CROSS APPLY и FOR XML для нормализации таблицы, содержащей список для информации?

Product Orderid
P1        1,2,3
P2        1,3
P3        1

Он должен быть нормализован, как показано ниже.

P1   1
P1   2
P1   3
P2   1
P2   3
P3   1

Я думаю, что это можно сделать с помощью CROSS APPLY FOR XML. Есть ли другой способ сделать это?


person Shine    schedule 26.07.2011    source источник
comment
Много потенциально актуальной информации в этом вопросе: вопросы/697519/   -  person Michael J Swart    schedule 26.07.2011
comment
@Майкл: Спасибо за редактирование. Ты сделал это осмысленно. Танк   -  person Shine    schedule 26.07.2011


Ответы (1)


Это проверено и работает:

SELECT * INTO #T
FROM (
  SELECT 'P1' Product, '1,2,3' OrderId
  UNION SELECT 'P2', '1,3'
  UNION SELECT 'P3', '1') x;

WITH S AS (
  SELECT product, x.t
  FROM #T cross apply
       (select convert(xml, N'<root><r>' + replace(orderid,',','</r><r>') + '</r></root>') t) x
)
SELECT s.Product, r.value('.', 'int') OrderId
FROM s cross apply t.nodes('//root/r') as records(r);

DROP TABLE #T;
person Yuck    schedule 26.07.2011