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.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.