dla wyjścia xml path ('')

9

Kiedy uruchomię następujące

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

Otrzymuję ten wynik

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

Jeśli uruchomię następujące

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

Otrzymuję ten wynik

Green/Blue/Red/

Dlaczego dodanie konkatenacji w zaznaczeniu prowadzi do usunięcia znaczników typu i wyświetlenia w jednym wierszu pliku xml? Uruchamianie programu SQL Server 2012.

kevinnwhat
źródło

Odpowiedzi:

15

XML to szaleństwo

Po dodaniu konkatenowanego ciągu tracisz „element ścieżki”.

Na przykład, jeśli to zrobisz:

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

Odzyskujesz to:

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

Nazwa kolumny lub alias działa jako element ścieżki.

Kilka innych przykładów, które mogą pomóc

Za pomocą 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;

W pierwszym przykładzie otrzymujesz ogólną nazwę elementu „row”, aw drugim otrzymujesz wiersz / type.

Podczas używania 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;

Pierwsze zapytanie zwraca poprawny kod XML, drugie zgłasza błąd, ponieważ element ścieżki nie ma identyfikatora.

Za AUTOpomocą aliasu tabeli i nazwy kolumny zmienia się ścieżka:

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;

Ale bez aliasu pojawia się podobny błąd:

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

Wymyśliłem przykład, FOR XML EXPLICITale to byłoby nieodpowiedzialne, żebym teraz zaczął pić.

Erik Darling
źródło