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>