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;
У першому прикладі ви отримуєте загальну назву елемента "рядок", а у другому ви отримуєте рядок / тип.
При використанні 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;
Перший запит повертає дійсний-ish XML, другий видає помилку, оскільки елементу шляху не вистачає ідентифікатора.
Використовуючи 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
настав приклад, але мені було б безвідповідально почати пити саме зараз.