3

以下を使用して XML ドキュメントを生成していますFOR XML EXPLICIT

declare @MyTable table (value xml);

insert into @MyTable values
 ('<foo bar="data1">content1</foo>')
,('<foo bar="data2">content2</foo>')
,('<foo bar="data3">content3</foo>');

select 1 as Tag, null as Parent
    , value as [x!1!!xml]
from @MyTable
for xml explicit;

そして、そのような応答を取得します:

<x>
  <foo bar="data1" xmlns="">content1</foo>
</x>
<x>
  <foo bar="data2" xmlns="">content2</foo>
</x>
<x>
  <foo bar="data3" xmlns="">content3</foo>
</x>

xmlns問題は、属性が必要ないことです。

解決策を見つけましたが、それはクラッジのようです。

select 1 as Tag, null as Parent
    , cast (value as varchar(200)) as [x!1!!xml]
from @MyTable
for xml explicit;

問題を解決するためのよりエレガントな方法はありますか?

を使用して提供しないでくださいFOR XML PATH/RAW/AUTO

EXPLICITモードは必須です。

4

1 に答える 1

2

ルート要素名 (つまりfoo、質問の例のデータ) がすべての行で同じである場合、これを達成するための簡単な方法があります。

  1. 列名にAttributeName項目 (3 番目の項目) を指定します。例のデータに関しては、それはfoo.

  2. xmltext の代わりにディレクティブ(4 番目の項目) を使用しxmlます。

列名は次のようになります。

[x!1!foo!xmltext]

完全なクエリは次のようになります。

SELECT 1 AS [Tag], NULL AS [Parent]
    , value AS [x!1!foo!xmltext]
FROM @MyTable
FOR XML EXPLICIT;

しかし、ルート要素名が異なる場合、上記の方法はオプションではなく、唯一の方法は XML データを次のように変換することのようです( 2 つとも UTF-16 である以降よりNVARCHARも良い選択です)。VARCHARXMLNVARCHAR

SELECT 1 AS [Tag], NULL AS [Parent]
    , CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
FROM @MyTable
FOR XML EXPLICIT;

詳細については、 MSDN のUse EXPLICIT Mode with FOR XMLのページを参照してください。

于 2015-12-26T09:22:07.803 に答える