我希望从 SQL Server 2005 表中创建一个以逗号分隔的值列表,就像在JanetOhara 的问题中一样。我使用的查询类似于techdo 对问题的回答中提出的查询。
一切正常,除了值列表被 XML 编码。应该是什么:
Sports & Recreation,x >= y
而是返回为:
Sports & Recreation,x <= y
在 SQL Server 中使用“FOR XML”时,有没有办法禁用 XML 字符编码?
我希望从 SQL Server 2005 表中创建一个以逗号分隔的值列表,就像在JanetOhara 的问题中一样。我使用的查询类似于techdo 对问题的回答中提出的查询。
一切正常,除了值列表被 XML 编码。应该是什么:
Sports & Recreation,x >= y
而是返回为:
Sports & Recreation,x <= y
在 SQL Server 中使用“FOR XML”时,有没有办法禁用 XML 字符编码?
您只需要使用正确的选项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'./text()[1]', N'nvarchar(max)'), 1, 1, N'');
GO
DROP TABLE dbo.x;
如果您使用的是较新版本的 SQL Server (2017+),则可以使用STRING_AGG()
XML 而完全不用担心:
SELECT STRING_AGG(y, N',') FROM dbo.x;
db<>fiddle演示了这三个。
你也可以这样做:
-- 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(N''), TYPE).value('(./text())[1]','varchar(max)'),1, 1, N'');