将具有不同值的xml列拆分为多个列

时间:2016-05-24 14:48:19

标签: sql xml

提前道歉但我在网上搜索了一个答案,但我似乎无法找到答案。我试过了

我有一个名为 RecurrencePatternXml 的列,其中包含xml,如下例所示,其中包含不同的数据并且可以经常更改。

<Recurrence StartDate="2015-03-10T00:00:00+00:00"><Weekly><Pattern Count="1"><Day>friday</Day></Pattern></Weekly></Recurrence>
<Recurrence StartDate="2015-04-01T00:00:00+01:00"><Weekly><Pattern Count="1"><Day>tuesday</Day><Day>thursday</Day><Day>sunday</Day></Pattern></Weekly></Recurrence>
<Recurrence StartDate="2015-04-27T00:00:00+01:00"><None /></Recurrence>    
<Recurrence StartDate="2015-03-10T00:00:00+00:00"><Daily FrequencyPerDay="2"><Pattern><DayPattern Value="1" /></Pattern></Daily></Recurrence>
<Recurrence StartDate="2015-10-02T00:00:00+01:00"><Weekly><Pattern Count="2"><Day>monday</Day><Day>wednesday</Day><Day>friday</Day><Day>sunday</Day></Pattern></Weekly></Recurrence>

我正在尝试编写一个查询,该查询将显示各列中的所有单个数据,并且在没有数据的情况下为null。

使用以下数据

<Recurrence StartDate="2015-11-12T00:00:00+00:00"><Weekly FrequencyPerDay="2"><Pattern count="1"><Day>tuesday</Day><Day>thursday</Day><Day>saturday</Day><Day>sunday</Day></Pattern></Weekly></Recurrence>
<Recurrence StartDate="2015-03-10T00:00:00+00:00"><Daily FrequencyPerDay="2"><Pattern><DayPattern Value="1" /></Pattern></Daily></Recurrence>

这将是我期望的输出。

Recurrence     Weekly        Daily      Pattern      Daypattern     Day1       Day2         Day3        Day 4          Day5       Day6             Day7
2015-11-12     2             NULL        1           NULL           NULL       tuesday      NULL        thursday       NULL       saturday         sunday
2015-03-10     NULL          2           NULL        1              NULL       NULL         NULL       NULL            NULL       NULL             NULL

1 个答案:

答案 0 :(得分:1)

尝试这样的事情

declare @dummy TABLE(ID INT, YourPattern XML);
INSERT INTO @dummy VALUES(1,
'<Recurrence StartDate="2015-03-10T00:00:00+00:00"><Weekly><Pattern Count="1"><Day>friday</Day></Pattern></Weekly></Recurrence>
<Recurrence StartDate="2015-04-01T00:00:00+01:00"><Weekly><Pattern Count="1"><Day>tuesday</Day><Day>thursday</Day><Day>sunday</Day></Pattern></Weekly></Recurrence>
<Recurrence StartDate="2015-04-27T00:00:00+01:00"><None /></Recurrence>    
<Recurrence StartDate="2015-03-10T00:00:00+00:00"><Daily FrequencyPerDay="2"><Pattern><DayPattern Value="1" /></Pattern></Daily></Recurrence>
<Recurrence StartDate="2015-10-02T00:00:00+01:00"><Weekly><Pattern Count="2"><Day>monday</Day><Day>wednesday</Day><Day>friday</Day><Day>sunday</Day></Pattern></Weekly></Recurrence>');

SELECT R.value('@StartDate','datetime') AS Recurrence
      ,CASE WHEN R.value('local-name(*[1])','varchar(max)')='Weekly' THEN R.value('(*/Pattern/@Count)[1]','int') END AS Weekly
      ,CASE WHEN R.value('local-name(*[1])','varchar(max)')='Daily'  THEN R.value('(*/@FrequencyPerDay)[1]','int') END AS Daily
      ,'don''t know what you need here' AS Pattern
      ,R.value('(*/Pattern/DayPattern/@Value)[1]','int') AS DayPattern
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='monday' THEN 1 ELSE 0 END AS Monday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='tuesday' THEN 1 ELSE 0 END AS Tuesday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='wednesday' THEN 1 ELSE 0 END AS Wednesday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='thursday' THEN 1 ELSE 0 END AS Thursday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='friday' THEN 1 ELSE 0 END AS Friday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='saturday' THEN 1 ELSE 0 END AS Saturday
      ,CASE WHEN R.value('(*/Pattern/Day/text())[1]','varchar(max)')='sunday' THEN 1 ELSE 0 END AS Sunday
FROM @dummy
CROSS APPLY YourPattern.nodes('/*') AS A(R)

结果

+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| Recurrence              | Weekly | Daily | Pattern                       | DayPattern | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| 2015-03-10 00:00:00.000 | 1      | NULL  | don't know what you need here | NULL       | 0      | 0       | 0         | 0        | 1      | 0        | 0      |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| 2015-03-31 23:00:00.000 | 1      | NULL  | don't know what you need here | NULL       | 0      | 1       | 0         | 0        | 0      | 0        | 0      |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| 2015-04-26 23:00:00.000 | NULL   | NULL  | don't know what you need here | NULL       | 0      | 0       | 0         | 0        | 0      | 0        | 0      |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| 2015-03-10 00:00:00.000 | NULL   | 2     | don't know what you need here | 1          | 0      | 0       | 0         | 0        | 0      | 0        | 0      |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+
| 2015-10-01 23:00:00.000 | 2      | NULL  | don't know what you need here | NULL       | 1      | 0       | 0         | 0        | 0      | 0        | 0      |
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+