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;
В первом примере вы получаете общее имя элемента row, но во втором вы получите row / type.
При использовании 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;
Первый запрос возвращает действительный 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
привел пример, но для меня было бы безответственно начинать пить прямо сейчас.