2013-03-26 46 views
34

我正在寻找从SQL Server 2005表中创建逗号分隔的值列表,就像在JanetOhara's question中一样。我正在使用与techdo's answer中提出的查询类似的查询。使用“FOR XML PATH”时如何避免字符编码?

一切正常,除了值列表正在获取XML编码。应该是什么:

Sports & Recreation,x >= y 

是不是返回为:

Sports & Recreation,x <= y 

有没有办法在SQL Server中使用时, “FOR XML” 禁用XML字符编码?

回答

81

您只需要使用FOR XML的正确选项。下面是避免编码一种方法:

USE tempdb; 
GO 

CREATE TABLE dbo.x(y nvarchar(255)); 

INSERT dbo.x SELECT 'Sports & Recreation' 
    UNION ALL SELECT 'x >= y' 
    UNION ALL SELECT 'blat' 
    UNION ALL SELECT '<hooah>'; 

-- bad: 
SELECT STUFF((SELECT N',' + y 
FROM dbo.x FOR XML PATH(N'')), 1, 1, N''); 

-- good: 
SELECT STUFF((SELECT N',' + y 
FROM dbo.x FOR XML PATH, TYPE).value(N'.[1]', 
N'nvarchar(max)'), 1, 1, N''); 

GO 
DROP TABLE dbo.x; 
+6

添加'type'和'.value('。[1]',nvarchar(max)')'完美地工作。谢谢您的帮助。 – dangowans 2013-03-26 17:45:37

+4

TYPE告诉SQL返回实际的XML,那么你必须“查询”这个XML为你想要的值,这是“.value('。[1]',nvarchar(max)')。 更多的信息在这里: http://technet.microsoft.com/en-us/library/ms190025.aspx – ProVega 2013-10-09 04:11:28

+1

我的字符串中的第一个字符是'<',这是由于某种原因在执行此解决方案后被省略。我通过添加一个在字符串开头的空白处 – alan 2015-04-02 14:05:30

0

查看Creating concatenated delimited string from a SQL result set and avoid character encoding when using “FOR XML PATH”

这篇文章的另一种方法是依靠字符连接(当然SQL不是伟大的字符串操作,因为它是开发工作与集合论)

USE tempdb; 
GO 

CREATE TABLE dbo.x (y NVARCHAR(255)); 
INSERT dbo.x 
SELECT 'Sports & Recreation' 
UNION ALL 
SELECT 'x >= y' 
UNION ALL 
SELECT 'blat' 
UNION ALL 
SELECT '<hooah>'; 

DECLARE @delimitedText varchar(max) 
SET @delimitedText='' 
SELECT @delimitedText += CASE WHEN LEN(@delimitedText) > 0 THEN +','+ y ELSE y END 
FROM dbo.x 

SELECT @delimitedText 
GO 
DROP TABLE dbo.x; 
GO 
相关问题