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 AUTO
pomocą 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 EXPLICIT
ale to byłoby nieodpowiedzialne, żebym teraz zaczął pić.