Возврат нескольких строк из значения столбца

Мне нужно создать XML из моей хранимой процедуры. Моя база данных имеет несколько значений, хранящихся в одной строке, например:

ScheduleID EmployeeID M Tu W Th F Sa Su ====================================================== 10 10001 1 1 0 0 0 0 0 11 10001 0 0 0 1 0 0 0 12 10002 0 0 0 0 0 1 1 

Мне нужно создать XML, который будет выглядеть следующим образом:

 <schedules> <task> <ScheduleID>10</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Monday</Workday> </task> <task> <ScheduleID>10</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Tuesday</Workday> </task> <task> <ScheduleID>11</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Thursday</Workday> </task> <task> <ScheduleID>12</ScheduleID> <EmployeeID>10002</EmployeeID> <Workday>Saturday</Workday> </task> <task> <ScheduleID>12</ScheduleID> <EmployeeID>10002</EmployeeID> <Workday>Sunday</Workday> </task> </schedules> 

Проблема, с которой я столкнулась, состоит в том, чтобы сделать вышеизложенное, мне нужно будет вернуть другую строку для каждого дня недели. Поэтому я думал использовать оператор case, однако ближайший я пришел, это не работает, поскольку он создает несколько столбцов с именем «Рабочий день». Поскольку может быть от 1 до 7 дней, которые действительны для каждого ScheduleID, добавление ELSE также не является вариантом. Как я могу это сделать?

 SELECT ScheduleID, EmployeeID, CASE WHEN (M = 1) THEN 'Monday' END as Workday, CASE WHEN (Tu = 1) THEN 'Tuesday' END as Workday, CASE WHEN (W = 1) THEN 1 ELSE 0 END as Workday, CASE WHEN (Th = 1) THEN 1 ELSE 0 END as Workday, CASE WHEN (F = 1) THEN 1 ELSE 0 END as Workday, CASE WHEN (Sa = 1) THEN 1 ELSE 0 END as Workday, CASE WHEN (Su = 1) THEN 1 ELSE 0 END as Workday FROM Schedules FOR XML PATH('task'), ROOT('schedules') 

Данные испытаний

 DECLARE @T TABLE (ScheduleID INT, EmployeeID INT , M INT, Tu INT, W INT, Th INT, F INT, Sa INT, Su INT) INSERT INTO @T VALUES (10 ,10001 ,1 , 1 , 0 , 0 , 0 , 0 , 0), (11 ,10001 ,0 , 0 , 0 , 1 , 0 , 0 , 0), (12 ,10002 ,0 , 0 , 0 , 0 , 0 , 1 , 1) 

запрос

 ;WITH X AS ( SELECT * FROM ( SELECT ScheduleID ,EmployeeID ,NULLIF(M , 0) AS Monday ,NULLIF(Tu, 0) AS Tuesday ,NULLIF(W , 0) AS Wednesday ,NULLIF(Th, 0) AS Thursday ,NULLIF(F , 0) AS Friday ,NULLIF(Sa, 0) AS Saturday ,NULLIF(Su, 0) AS Sunday FROM @T )t UNPIVOT (Vals FOR Workday IN (Monday,Tuesday,Wednesday,Thursday ,Friday,Saturday,Sunday))up ) SELECT ScheduleID ,EmployeeID ,Workday FROM X FOR XML PATH('task'), ROOT('schedules') 

Результат:

 <schedules> <task> <ScheduleID>10</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Monday</Workday> </task> <task> <ScheduleID>10</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Tuesday</Workday> </task> <task> <ScheduleID>11</ScheduleID> <EmployeeID>10001</EmployeeID> <Workday>Thursday</Workday> </task> <task> <ScheduleID>12</ScheduleID> <EmployeeID>10002</EmployeeID> <Workday>Saturday</Workday> </task> <task> <ScheduleID>12</ScheduleID> <EmployeeID>10002</EmployeeID> <Workday>Sunday</Workday> </task> </schedules> 
  • FOR XML SQL Server - имя переменной в выводе XML
  • SQL Server: группировка по конкатенации строк
  • Как сделать поворот в сочетании с FOR XML PATH в SQL Server?
  • TSQL для xml-пути. Как включить элемент контейнера подзапроса, даже если подзапрос пуст?
  • TSQL для форматирования XML
  • Создание XML из таблицы SQL (уникальное форматирование XML)
  • Sql FOR XML PATH возвращает неверный синтаксис рядом с 'PATH'
  • FOR XML PATH (''): экранирование «специальных» символов
  • SQL FOR XML PATH и COUNT
  • Выбор в SQL Server не работает в MySQL, функция заполнения
  • SQL Server 2008: Null Return в динамическом XML-запросе
  • Interesting Posts

    Расширение mssql в маме

    Проблемы с чтением строки со странными символами в SQL Server 2008 и предыдущих версиях

    Обработка строк для столбца в SQL Server

    Справка по sql-запросу, синтаксическая помощь для выбора записей, не выбранных с помощью оператора внутреннего выбора

    Вставка SQL в выбранные значения возврата

    Хранение DateTime (UTC) и сохранение DateTimeOffset

    SQL Trigger не работает при попытке запустить триггер

    Конкат со значением NULL

    Как объединить несколько строк в список с разделителями-запятыми в SQL Server 2005?

    Как отсортировать столбец в sql на основе значения B, где значения в полях находятся в формате ABC. Я w

    Значение не может быть равно null: соединение во время тестирования базы данных

    Почему SQL Management Studio выводит ненулевые символы при сохранении в виде csv?

    Получите строки ТОЛЬКО, где разница во времени между текущей и следующей строкой составляет менее 5 минут

    Объединение различных условных запросов выбора в один – со структурой

    Возможно вернуть параметр out с помощью DataReader

    Давайте будем гением компьютера.