Версия SQL Server для group_concat и экранированных строк MySQL - PullRequest
1 голос
/ 08 апреля 2010

У меня есть только экспресс-версии MS SQL Server 2008 и Visual Studio. Учитывая, что я не могу создать проект SQL Server и, следовательно, о решениях CLR не может быть и речи, я попытался использовать

select col1, stuff( ( select ' ' + col2
from StrConcat t1
where t2.col1 = t1.col1
for xml path('')
),1,1,'')
from StrConcat t2
group by col1
order by col1

, чтобы получить объединенную строку col2. col2 - это поле varchar с некоторыми управляющими символами, такими как & и \ n . Когда он объединяется с вышеуказанным SQL, он, кажется, экранирует эти управляющие символы, т.е. & становится & amp; и \ n становится & # xOD, а это не то, чего я хочу. Учитывая, что поле col1 и сцепленное поле будет использоваться для обновления другой таблицы, каков наилучший способ получить объединенное поле в его исходном виде без экранирования или нет и единственный способ - прибегнуть к внешнему коду?

Схема таблицы выглядит следующим образом: StrConcat (первичный ключ id int, col1 int, txt varchar (80)) У col1 есть индекс, txt должен быть сгруппирован по col1, упорядочен по id внутри группы.

1 Ответ

1 голос
/ 08 апреля 2010

Поведение, конечно, по замыслу . Если этого не избежать, запрос может вывести недопустимый XML.

Если вам нужно получить неэкранированное значение в SQL Server, вам придется использовать один из других методов конкатенации (рекурсивный CTE обычно следующий по эффективности после агрегации CLR и FOR XML, но сложнее всего написать).

Конечно, если это передается непосредственно приложению, его будет гораздо проще удалить из него, т. Е. С помощью класса XmlReader в .NET.

...