xml path( '')出力の場合


9

次を実行すると

select t.type
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

この出力を受け取ります

<type>Green</type>
<type>Blue</type>
<type>Red</type>

次を実行すると

select t.type + '/'
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

この出力を受け取ります

Green/Blue/Red/

selectに連結を追加すると、typeタグが削除され、xmlファイルの1行に出力されるのはなぜですか?SQL Server 2012を実行しています。

回答:


15

XMLは厄介です

連結された文字列を追加すると、「パス要素」が失われます。

たとえば、次のようにした場合:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('');

SELECT t.type + '/' 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('type');

あなたはこれを取り戻します:

<type>Green/</type>
<type>Blue/</type>
<type>Red/</type>

列名またはエイリアスは、パス要素として機能します。

役立つかもしれない他のいくつかの例

使用する RAW, ELEMENTS

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

最初の例では、一般的な「行」要素名を取得しますが、2番目の例では、行/タイプを取得します。

使用する場合RAW, TYPE

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

最初のクエリは有効なXMLを返し、2番目のクエリはパス要素に識別子がないためエラーをスローします。

を使用するAUTOと、テーブルのエイリアスと列名がパスに変わります。

SELECT type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

SELECT type 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

しかし、エイリアスがないと、同様のエラーが発生します。

SELECT type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

私は例を挙げてFOR XML EXPLICITいますが、今すぐ飲み始めるのは無責任です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.