60

JanetOharaの質問のように、SQLServer2005テーブルから値のコンマ区切りリストを作成しようとしています。techdoの質問への回答に示されているものと同様のクエリを使用しています。

値のリストがXMLエンコードされていることを除いて、すべてが機能しています。あるべきもの:

Sports & Recreation,x >= y

代わりに次のように返されます:

Sports & Recreation,x <= y

SQLServerで「FORXML」を使用するときにXML文字エンコードを無効にする方法はありますか?

4

3 に答える 3

139

で適切なオプションを使用する必要がありますFOR XML。エンコーディングを回避する1つのアプローチは次のとおりです。

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;

新しいバージョンのSQLServer(2017以降)を使用している場合は、STRING_AGG()XMLを使用でき、XMLについてまったく心配する必要はありません。

SELECT STRING_AGG(y, N',') FROM dbo.x;

3つすべてを示す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 に答える