sql xml 带有嵌套节点
sql xml with nested node
我在 MS sql 服务器 2012
中有以下 table
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')
SQLXML代有点奇怪。如果您需要两个同名的元素相互跟随,您需要用 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 服务器的突发奇想独立排序。
要生成新的 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>
我在 MS sql 服务器 2012
中有以下 table 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')
SQLXML代有点奇怪。如果您需要两个同名的元素相互跟随,您需要用 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 服务器的突发奇想独立排序。
要生成新的 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>