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
いますが、今すぐ飲み始めるのは無責任です。