Подтвердить что ты не робот

Как избежать кодирования символов при использовании "FOR XML PATH"?

Я хочу создать список значений, разделенных запятыми, из таблицы SQL Server 2005, как в вопросе JanetOhara. Я использую запрос, похожий на тот, который представлен в techdo answer на вопрос.

Все работает, за исключением того, что список значений получает XML-кодирование. Что должно быть:

Sports & Recreation,x >= y

Вместо этого возвращается как:

Sports & Recreation,x <= y

Есть ли способ отключить кодировку символов XML при использовании "FOR XML" в SQL Server?

4b9b3361

Ответ 1

Вам просто нужно использовать правильные опции с 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 '';

-- 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;

Ответ 2

Смотрите это сообщение на Создание конкатенированной строки с разделителями из набора результатов SQL и избегайте кодировки символов при использовании "FOR XML PATH"

Альтернативный подход состоял бы в том, чтобы полагаться на конкатенацию символов (конечно, sql не очень хорош в строковых операциях, поскольку он разработан для работы с теорией множеств)

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