Mar*_*der 6 xml t-sql sql-server-2008
我试图匹配SQL Server 2008 TSQL查询中的一些XML输出.我匹配的XML可以返回项目列表.列表由属性名称标识 - 而不是节点名称.
XML Path函数将返回一个包装器节点,但我找不到向该节点添加任何属性的方法.在我的情况下,它们将是基于我们正在运行的表名称的硬编码值.
我将'x'作为'x'来保持两个列表分开.在我的实际数据中,这不是问题,因为它们位于不同的节点中.问题是如何将属性添加到"列表"节点.
这是以下示例的SQL Fiddle页面:
示例模式
create table Table1 (Value varchar(50));
create table Table2 (Value varchar(50));
insert Table1 values
('A'), ('B'), ('C');
insert Table2 values
('X'), ('Y'), ('Z');
Run Code Online (Sandbox Code Playgroud)
样品选择
select
(
select Value as '@I'
from Table1
for XML PATH('L'), TYPE
) as List,
'x' as 'x', -- needed to keep the Lists apart.
(
select Value as '@I'
from Table2
for XML PATH('L'), TYPE
) as List
for XML PATH
Run Code Online (Sandbox Code Playgroud)
实际产出
<row>
<List>
<L I="A"/>
<L I="B"/>
<L I="C"/>
</List>
<x>x</x>
<List>
<L I="X"/>
<L I="Y"/>
<L I="Z"/>
</List>
</row>
Run Code Online (Sandbox Code Playgroud)
期望的输出:(将"Name"属性添加到列表包装器.)
<row>
<List Name='Table1'> <!-- Added Attribute "Name" here -->
<L I="A"/>
<L I="B"/>
<L I="C"/>
</List>
<x>x</x>
<List Name='Table2'> <!-- Added Attribute "Name" here -->
<L I="X"/>
<L I="Y"/>
<L I="Z"/>
</List>
</row>
Run Code Online (Sandbox Code Playgroud)
这似乎给出了正确的输出.XML PATH要将属性放到List节点上,需要额外的嵌套级别:
SELECT
(SELECT 'Table1' AS '@name',
(SELECT Value AS '@I'
FROM Table1
FOR XML PATH ('L'))
FOR XML PATH('List'), TYPE)
,'x' AS'x'
,( SELECT 'Table2' AS '@name',
(SELECT Value AS '@I'
FROM Table2
FOR XML PATH ('L'))
FOR XML PATH('List'), TYPE
)
FOR XML PATH;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4736 次 |
| 最近记录: |