2013-03-26 44 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 
相關問題