Jor*_*rke 5 xml t-sql sql-server-2005 for-xml for-xml-path
大家早上好,
我有一个使用 FOR XML PATH 输出 .xml 文件的大查询。我有主要的选择,它基本上只代表根,即
select *
from tbl
for xml path ('root'),elements xsinil
Run Code Online (Sandbox Code Playgroud)
然后我在这个主选择中进行了后续的嵌套选择,即
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
Run Code Online (Sandbox Code Playgroud)
然而,放在 for xml 路径上的元素 xsinil 参数对包含的子查询没有任何影响,即 Level1 元素只是一个封闭的标签。我需要将其显示为 xsi:nil="true"。
我可以通过向 for xml 路径语句添加元素 xsinil 参数来实现这一点,例如
for xml path('nested1'),type,elements xsinil
Run Code Online (Sandbox Code Playgroud)
这样做的问题是命名空间声明在子查询级别重复。
我可以找到很多使用元素 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>
Run Code Online (Sandbox Code Playgroud)
希望你能帮上忙!
我认为不可能通过使用子查询来防止这种行为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
Run Code Online (Sandbox Code Playgroud)
结果:
<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>
Run Code Online (Sandbox Code Playgroud)