2010-06-23 51 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. 

希望它有幫助。