6

我正在尝试在 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');

样品选择

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

实际输出

<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>

所需输出:(将“名称”属性添加到列表包装器。)

<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>
4

1 回答 1

5

这似乎给出了正确的输出。需要额外的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;
于 2012-07-21T07:23:53.433 回答