TYPE
означает, что подзапрос возвращает значение XML
тип данных вместо строки.
Затем .value
вызывает метод для типа данных XML
, чтобы получить значение элемента в виде строки.
Причина, по которой второй предпочтительнее первого, заключается в случай, когда результат конкатенации содержит такие символы, как <
. Они будут отображаться как желаемые в конечном результате, а не как необработанные XML объекты, такие как <
SELECT 'John' AS Firstname into #TEMP UNION ALL SELECT 'Jack <&>'
SELECT ' ,' +de.Firstname -- ,John ,Jack <&>
FROM #TEMP de
FOR XML PATH ('')
SELECT (SELECT ' ,' +de.Firstname -- ,John ,Jack <&>
FROM #TEMP de
FOR XML PATH (''),TYPE).value('.[1]', 'NVARCHAR(MAX)');
Второй ведет себя так же, как
SELECT CAST(',John ,Jack <&>' AS XML).value('.[1]', 'NVARCHAR(MAX)');
(По Кстати, если вы запустите их в SSMS, вы можете быть удивлены тем, что результатом первого на самом деле является строка, так как она выглядит как интерактивная XML в виде сетки, но это связано со специальным регистром неявного имени столбца XML_F52E2B61-18A1-11d1-B105-00805F49916B
not тип данных)