2013-09-04 1 views
1

У меня есть следующий запрос:Split FOR XML PATH результатов в отдельные строки

SELECT 
    101 AS TeacherID 
    ,s.ID 
    ,s.First 
    ,s.Last 
FROM dbo.Students s 
FOR XML PATH('Student'), ROOT('Students') 

, который генерирует выходной сигнал:

<Students> 
    <Student> 
    <TeacherID>101</TeacherID> 
    <ID>14</ID> 
    <First>Mark</First> 
    <Last>Smith</Last> 
    </Student> 
    <Student> 
    <TeacherID>101</TeacherID> 
    <ID>15</ID> 
    <First>Josephina</First> 
    <Last>Hewitt</Last> 
    </Student> 
</Students> 

Я хочу, чтобы разбить каждую группу в свои собственные ряды (в одну XMLFormat колонка):

AdministratorID AdministratorName XMLFormat 
------------------------------------------------------------------------------------------------------------------------------------ 
125    Bertha    <Student><TeacherID>101</TeacherID><ID>14</ID><First>Mark</First><Last>Smith</Last></Student> 
125    Bertha    <Student><TeacherID>101</TeacherID><ID>15</ID><First>Josephina</First><Last>Hewitt</Last></Student> 

Я попытался с помощью таблиц и столбцов метод Alias:

SELECT 125 AS AdministratorID, 
     'Bertha' AS AdministratorName, 
     t.c AS XMLFormat 
FROM 
( 
    SELECT 
     101 AS TeacherID 
     ,s.ID 
     ,s.First 
     ,s.Last 
    FROM dbo.Students s 
    FOR XML PATH('Student'), ROOT('Students') 
) t(c) 

но этот запрос генерирует одну строку данных, причем весь XML в одном поле XMLFormat.

Я думал, что мне может понадобиться использовать метод .nodes(), но когда я добавляю .nodes ('/ Students/Student') к псевдониму t (c), я получаю «Неверный синтаксис рядом с.».

Я хочу избежать пометок данных в переменную XML перед использованием метода .nodes(), потому что текст может быть очень длинным.

ответ

2
select 
    125 as AdministratorID, 
    'Bertha' as AdministratorName, 
    (
     select 
      101 as TeacherID, s.ID, s.First, s.Last 
     for xml path('Student'), type 
    ) as XMLFormat 
from dbo.Students s