2013-03-26 17 views
34

Czekam na utworzenie rozdzielonej przecinkami listy wartości z tabeli SQL Server 2005, podobnie jak w JanetOhara's question. Używam kwerendy podobnej do tej przedstawionej w techdo's answer na pytanie.Jak uniknąć kodowania znaków podczas używania "FOR XML PATH"?

Wszystko działa, ale lista wartości jest kodowana XML. Co powinno być:

Sports & Recreation,x >= y 

Czy zamiast wracać jak:

Sports & Recreation,x <= y 

Czy istnieje sposób, aby wyłączyć kodowanie znaków XML przy użyciu "FOR XML" w SQL Server?

Odpowiedz

81

Wystarczy użyć odpowiednich opcji za pomocą FOR XML. Oto jeden sposób, który unika kodowanie:

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

Dodanie "type" i ".value (". [1] ", nvarchar (max)") "działało idealnie. Dzięki za pomoc. – dangowans

+4

RODZAJ mówi SQL, aby zwrócił rzeczywisty kod XML, następnie musisz "zapytać" ten kod XML o wartość, która ma być ".value (". [1] ", nvarchar (max)"). Więcej informacji tutaj: http://technet.microsoft.com/en-us/library/ms190025.aspx – ProVega

+1

Pierwszy znak w moim ciągu znaków był "<", to z jakiegoś powodu zostało pominięte po wdrożeniu tego rozwiązania. Rozwiązałem ten problem, dodając puste miejsce na początku ciągu znaków – alan

0

Zobacz ten post w Creating concatenated delimited string from a SQL result set and avoid character encoding when using “FOR XML PATH”

Alternatywnym rozwiązaniem byłoby polegać na łączenie znaków (oczywiście SQL nie jest wielki z operacji strun, ponieważ został opracowany do pracy z teorią mnogości)

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 
Powiązane problemy