2016-05-24 2 views
1

Извините, но я искал в сети и на этом сайте ответ, но я просто не могу его найти. Я пробовалРазделите столбец 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> 

Я пытаюсь написать запрос, который будет показывать все индивидуальные данные в отдельных столбцах и быть нулевым, где нет данных.

Используя данные ниже

<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 
+0

Привет, я просто редактировал свой ответ, чтобы получить * * более из вашего XML ... – Shnugo

ответ

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  | 
+-------------------------+--------+-------+-------------------------------+------------+--------+---------+-----------+----------+--------+----------+--------+ 
+0

Hi Shnugo. Спасибо за ваш ответ. Я сейчас дам это. – Mally

+0

Привет снова. Спасибо за помощь. Кажется, что первая строка работает, но я не думаю, что остальные верны. Не уверен, что я просто читаю его неправильно. В таблицу загружается всего пять строк данных. Но на выходе 10 строк, а некоторые даты не совпадают или отсутствуют. Также есть неправильные моменты в выходе, и мне просто нужно было, например, 2015-03-10. Очень благодарен за вашу помощь. – Mally

+0

@Mally Пожалуйста, добавьте ожидаемый результат (соответствующий данным) на ваш вопрос, thx – Shnugo

Смежные вопросы