2015-03-23 5 views
2

Say Я использую FOR XML суб запрос, чтобы конкатенация и сортировки, а кроме того, данные содержат угловые скобки:Decode текст из FOR XML Sql запросы

SELECT STUFF((SELECT ', ' + '<' + NAME + '>' 
      FROM [sys].[login_token] 
      ORDER BY NAME 
      FOR XML PATH('')), 1, 2, '') AS Logins; 

выводится что-то вроде

&lt;\Everyone&gt;, &lt;BUILTIN\Administrators&gt;, &lt;BUILTIN\Administrators&gt; 

Как я могу иметь его декодируется, то есть, что-то вроде этого:

<\Everyone>, <BUILTIN\Administrators>, <BUILTIN\Administrators>, 

?

ответ

3

Вы можете сделать запрос по XML и вернуть преобразованное значение!

SELECT STUFF((SELECT ', ' + '<' + NAME + '>' 
      FROM [sys].[login_token] 
      ORDER BY NAME 
      FOR XML PATH(''), type).value('.','NVARCHAR(MAX)') 
      , 1, 2, '') AS Logins; 

Вы добавляете , type к FOR XML PATH спецификации, то .value с выражением XQuery и тип данных для преобразования! Смотрите MSDN здесь:

https://msdn.microsoft.com/en-us/library/ms178030.aspx

+0

Это не работает с подстроки по какой-то причине, работает только с STUFF. Любые идеи почему? – Shiroy

+1

Материал просто прошивает ведущую запятую, если вы замените ее подстрокой, вам нужно исправить параметры, например. вы хотите SUBSTRING ([selectfunction], 3, 10000), чтобы начать с символа 3, чтобы удалить запятую и вернуть следующие 10000 символов. – user917170

0

можно также использовать 2 replace функции:

SELECT replace(replace(STUFF((SELECT ', ' + '<' + NAME + '>' 
      FROM [sys].[login_token] 
      ORDER BY NAME 
      FOR XML PATH('')), 1, 2, ''),'&lt;','<'),'&gt;','>') AS Logins;