60

我希望从 SQL Server 2005 表中创建一个以逗号分隔的值列表,就像在JanetOhara 的问题中一样。我使用的查询类似于techdo 对问题的回答中提出的查询。

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

Sports & Recreation,x >= y

而是返回为:

Sports & Recreation,x <= y

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

4

3 回答 3

139

您只需要使用正确的选项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演示了这三个。

于 2013-03-26T17:35:38.357 回答
1

你也可以这样做:

-- 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'');
于 2020-09-28T14:54:43.053 回答
0
于 2015-06-23T23:19:18.093 回答