sql xml с вложенным узлом - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица ниже в MS sql server 2012

 emp_ID     emp_dept
 -2          HR
  3          CS

Мне нужен следующий формат xml:

<row>
  <staticData>
  <Field fld="emp_ID" value="-2" />
  <Field fld="emp_ID" value="3" /> 
  </staticData> 
 <DynData>
  <Field fld="emp_dept" value="HR" />
  <Field fld="emp_dept" value="CS" />
  </DynData> 
</row>

У меня есть пример запроса, но он не работает для нескольких столбцов:

  SELECT top 5 
 'emp_ID'  AS [Field/@fld],  
 emp_ID  AS [Field/@value]   
 FROM Employee
 FOR XML PATH ('staticData'), ROOT('row')

1 Ответ

2 голосов
/ 17 марта 2020

SQL XML поколение немного странно. Если вам нужно, чтобы два элемента с одинаковыми именами следовали друг за другом, вам нужно разделить их столбцом null, например:

select top 5 
  'emp_ID' as [Field/@fld],  
  emp_ID as [Field/@value],
  null, --<<-- TRICK
  'emp_dept' as [Field/@fld],  
  emp_dept as [Field/@value]
from (values
  (-2, N'HR'),
  (3, N'CS')
) Employee (emp_ID, emp_dept)
for xml path('staticData'), root('row')

Который дает ...

<row>
    <staticData>
        <Field fld="emp_ID" value="-2"/>
        <Field fld="emp_dept" value="HR"/>
    </staticData>
    <staticData>
        <Field fld="emp_ID" value="3"/>
        <Field fld="emp_dept" value="CS"/>
    </staticData>
</row> 

=====

Второй ответ, соответствующий второй версии вопроса ...

Я бы спросил вашего дизайнера о требованиях нового XML. Теперь нет элементов между элементами, содержащими атрибуты emp_ID и emp_dept. Раньше они были братьями и сестрами, сгруппированными внутри родительских элементов staticData, теперь они находятся в разных родительских элементах и ​​могут быть заказаны независимо в соответствии с прихотями SQL Server.

Для создания нового формата XML требуются подзапросы для заполнить дочерние элементы элементов staticData и DynData, например:

create table dbo.Employee (
  emp_ID int not null,
  emp_dept nvarchar(2) not null
);

insert dbo.Employee (emp_ID, emp_dept) values
  (-2, N'HR'),
  (3, N'CS');

select
  (
    select
      'emp_ID' as [@fld],  
      emp_ID as [@value]
    from Employee
    for xml path('Field'), type
  ) as [staticData],
  (
    select
      'emp_dept' as [@fld],  
      emp_dept as [@value]
    from Employee
    for xml path('Field'), type
  ) as [DynData]
for xml path('row');

, что приводит к ...

<row>
    <staticData>
        <Field fld="emp_ID" value="-2"/>
        <Field fld="emp_ID" value="3"/>
    </staticData>
    <DynData>
        <Field fld="emp_dept" value="HR"/>
        <Field fld="emp_dept" value="CS"/>
    </DynData>
</row>
...