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 を使用する例はたくさんありますが、namespace 宣言を繰り返さずにサブクエリに適用する例はありません。

確認するために、次の出力を探しています。

<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 に答える