5

大家早上好,

我有一个使用 FOR XML PATH 输出 .xml 文件的大型查询。我有主要选择,它基本上只代表根,即

select *
from tbl
for xml path ('root'),elements xsinil

然后我在这个主选择中有后续的嵌套选择,即

select 
    (
        select null [level1],
               '2'  [level2]
        from tbl
        for xml path('nested1'),type
    ),
    (
        select null [level1],
               '2'  [level2]
        from tbl
        for xml path('nested2'),type
    )
for xml path('root'),elements xsinil

但是,放置在 for xml 路径上的元素 xsinil 参数对包含的子查询没有任何影响,即 Level1 元素只是一个封闭标记。我需要将其显示为 xsi:nil="true"。

我可以通过将元素 xsinil 参数添加到 for xml 路径语句来实现这一点,例如

for xml path('nested1'),type,elements xsinil

这样做的问题是命名空间声明在子查询级别重复。

我可以找到很多使用元素 xsinil 的示例,但没有一个可以在没有重复命名空间声明的情况下应用于子查询。

为了确认,我正在寻找以下输出:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <nested1>
    <level1 xsi:nil="true">
    <level2>2</level2>
  </nested1>
  <nested2>
    <level1 xsi:nil="true">
    <level2>2</level2>
  </nested2>
</root>

希望你能帮忙!

4

1 回答 1

3

我认为使用for xml path. 这里报告了一个类似的问题。https://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements

如果你使用它,你可以获得你想要的输出for xml explicit

declare @T table(Level1 int, Level2 int)
insert into @T values(null, 2)

select 1    as Tag,
       null as Parent,
       null as [root!1],
       null as [nested1!2!level1!ELEMENTXSINIL],
       null as [nested1!2!level2!ELEMENTXSINIL],
       null as [nested2!3!level1!ELEMENTXSINIL],
       null as [nested2!3!level2!ELEMENTXSINIL]
union all
select 2    as Tag,
       1    as Parent,
       null,
       Level1,
       Level2,
       null,
       null
from @T       
union all
select 3    as Tag,
       1    as Parent,
       null,
       null,
       null,
       Level1,
       Level2
from @T       
for xml explicit       

结果:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <nested1>
    <level1 xsi:nil="true" />
    <level2>2</level2>
  </nested1>
  <nested2>
    <level1 xsi:nil="true" />
    <level2>2</level2>
  </nested2>
</root>
于 2011-06-23T11:21:41.087 回答