TSQL реверс для кодирования XML - PullRequest
0 голосов
/ 23 июня 2010

Я использую FOR XML в запросе для объединения нескольких строк, но текст содержит кавычки, "<", ">" и т. Д. Мне нужен реальный символ вместо закодированного значения, такого как "" "и т. Д. Любойпредложения?

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

По сути, вы запрашиваете недопустимый XML, и, к счастью, SQL Server его не выдаст.Вы можете взять сгенерированный XML и извлечь содержимое, и эта операция вернет экранированные символы в их текстовое представление.Это восстановление обычно происходит в presnetaitonlayer, но оно может происходить в SQL Server самостоятельно, например, с использованием методов XML для извлечения содержимого созданного вывода FOR XML.Например:

declare @text varchar(max) = 'this text has < and >';
declare @xml xml;

set @xml = (select @text as [node] for xml path('nodes'), type);

select @xml;
select x.value(N'.', N'varchar(max)') as [text]
from @xml.nodes('//nodes/node') t(x);
1 голос
/ 23 июня 2010

У меня есть аналогичное требование для извлечения имен столбцов для использования в запросе PIVOT.

Я использовал следующее решение:

SELECT @columns = STUFF((SELECT '],[' + Value
                               FROM Table
                              ORDER BY Value
                                FOR XML PATH('')), 1, 2, '') + ']'

Это дает одну строку:

[Value 1],[Value 2],[Value 3]

Надеюсь, это направит вас в правильном направлении.

0 голосов
/ 08 октября 2012
--something like this?
SELECT * INTO #Names FROM (
   SELECT Name='<>&' UNION ALL
   SELECT Name='ab<>'
) Names;
-- 1)
SELECT STUFF(
    (SELECT ', ' + Name FROM #Names FOR XML PATH(''))
    ,1,2,'');
-- 2)
SELECT STUFF(
    (SELECT ', ' + Name FROM #Names FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)')
    ,1,2,'');
-- 2) is slower but will not return encoded value.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...