для виводу xml шляху ('')


9

Коли я запускаю наступне

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

Я отримую цей вихід

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

Якщо я запускаю наступне

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

Я отримую цей вихід

Green/Blue/Red/

Чому додавання конкатенації у вибраному призводить до видалення тегів типу та виведення в одному рядку у XML-файл? Запуск SQL Server 2012.

Відповіді:


15

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настав приклад, але мені було б безвідповідально почати пити саме зараз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.