I'm looking to create a comma-separated list of values from a SQL Server 2005 table, just like in JanetOhara's question. I'm using a query similar to the one presented in techdo's answer to the question.
Everything is working, except the list of values is getting XML encoded. What should be:
Sports & Recreation,x >= y Is instead returning as:
Sports & Recreation,x <= y Is there a way to disable the XML character encoding when using "FOR XML" in SQL Server?
You just need to use the right options with FOR XML. Here's one approach that avoids encoding:
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'./text()[1]', N'nvarchar(max)'), 1, 1, N''); GO DROP TABLE dbo.x; If you are on a newer version of SQL Server (2017+), you can use STRING_AGG() and not worry about XML at all:
SELECT STRING_AGG(y, N',') FROM dbo.x; db<>fiddle demonstrating all three.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With