Как избежать кодирования символов при использовании "FOR XML PATH"?
Я хочу создать список значений, разделенных запятыми, из таблицы SQL Server 2005, как в вопросе JanetOhara. Я использую запрос, похожий на тот, который представлен в techdo answer на вопрос.
Все работает, за исключением того, что список значений получает XML-кодирование. Что должно быть:
Sports & Recreation,x >= y
Вместо этого возвращается как:
Sports & Recreation,x <= y
Есть ли способ отключить кодировку символов XML при использовании "FOR XML" в SQL Server?
Ответы
Ответ 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