вернуть родительские и дочерние данные, используя FOR XML в сохраненном процессе - PullRequest
2 голосов
/ 26 февраля 2010

Если у меня есть родительская таблица и дочерняя таблица, где может быть один родитель для многих детей, как я могу вернуть следующий xml из хранимой процедуры в хранимую процедуру?

<Parents>
    <Parent>
       <ID>Integer</ID>
       <Children>
           <Child>
               <ID>Integer</ID>
               <Text>String</Text>
           </Child>
           <Child>
               <ID>Integer</ID>
               <Text>String</Text>
           </Child>
        </Children>
    </Parent>
    <Parent>
       <ID>Integer</ID>
       <Children>
           <Child>
               <ID>Integer</ID>
               <Text>String</Text>
           </Child>
           <Child>
               <ID>Integer</ID>
               <Text>String</Text>
           </Child>
        </Children>
    </Parent>
</Parents>

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Вы можете сделать это с помощью некоторых вложенных выборок.

select 'a' as "ID",
 (
 select child as "ID"
 from ( select 'integer' as child
   union all
   select 'string' ) a
   for xml path('Child'), type, root('Childrens') 
   ) as "*"
for xml path('Parent'), type, root('Parents')

Оппс, я не видел, что это было для Sql-Server-2000.

1 голос
/ 26 февраля 2010

Это определенно намного сложнее с SQL 2000. Ниже приведен пример запроса, который может помочь вам начать этот процесс. Пожалуйста, поймите, что это не совсем тот формат, который вы ищете. Цель запроса - помочь вам начать ... подтолкнуть в правильном направлении.

Хитрость здесь в том, чтобы использовать FOR XML EXPLICIT и тщательно создавать псевдонимы столбцов для управления расположением элементов.

Declare @Parent Table(Id Int, Data VarChar(20))
Insert Into @Parent Values(1, 'Fruit')
Insert Into @Parent Values(2, 'Vegetable')

Declare @Child Table(Id Int, ParentId Int, Name VarChar(20))
Insert Into @Child Values(1, 1, 'Apple')
Insert Into @Child Values(2, 1, 'Banana')
Insert Into @Child Values(3, 2, 'Carrot')
Insert Into @Child Values(4, 2, 'Pea')

Select 1 As Tag,
       NULL As Parent,
       Id As [Parent!1!Id!Element],
       Data As [Parent!1!Data!Element],
       NULL As [Child!2!Id!Element],
       NULL As [Child!2!Name!Element]
From   @Parent P

Union

Select  2 As Tag,
        1 As Parent,
        P.Id,
        NULL,
        C.Id,
        Name
From    @Child C
        Inner Join @Parent P
          On C.ParentId = P.Id
Order By [Parent!1!Id!Element]
For XML Explicit
...