2010-06-23 50 views
0

我在查询中使用FOR XML将多个行连接在一起,但文本包含引号“<”,“>”等。我需要实际字符而不是编码值,例如“ "“等。有什么建议吗?对于XML编码的TSQL反向

回答

1

我有一个类似的需求来提取列名以用于PIVOT查询。

我使用的解决方案如下:

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

这将产生一个字符串:

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

我希望这点你在正确的方向。

+0

完美!谢谢! – Benny 2010-06-24 23:26:12

3

基本上你要求的是无效的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); 
0
--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. 

希望它有帮助。