für die Ausgabe des XML-Pfads ('')

9

Wenn ich folgendes ausführe

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

Ich erhalte diese Ausgabe

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

Wenn ich folgendes ausführe

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

Ich erhalte diese Ausgabe

Green/Blue/Red/

Warum führt das Hinzufügen der Verkettung in der Auswahl zum Entfernen der Typ-Tags und zur Ausgabe in einer Zeile in der XML-Datei? Ausführen von SQL Server 2012.

kevinnwhat
quelle

Antworten:

15

XML ist verrückt

Wenn Sie die verkettete Zeichenfolge hinzufügen, verlieren Sie das "Pfadelement".

Zum Beispiel, wenn Sie dies tun:

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');

Du bekommst das zurück:

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

Der Spaltenname oder Alias ​​fungiert als Pfadelement.

Einige andere Beispiele, die helfen könnten

Verwenden von 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;

Im ersten Beispiel erhalten Sie den generischen Elementnamen "row", im zweiten Beispiel erhalten Sie row / type.

Bei Verwendung von 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;

Die erste Abfrage gibt gültiges XML zurück, die zweite gibt einen Fehler aus, da dem Pfadelement eine Kennung fehlt.

Mit AUTOwird der Tabellenalias und der Spaltenname in den Pfad umgewandelt:

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;

Ohne Alias ​​wird jedoch ein ähnlicher Fehler angezeigt:

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

Ich würde ein Beispiel dafür finden, FOR XML EXPLICITaber es wäre unverantwortlich für mich, sofort mit dem Trinken zu beginnen.

Erik Darling
quelle