Есть ли какие-нибудь уловки для предотвращения того, чтобы SQL Server давал права таким символам, как &, <и>? Я пытаюсь вывести URL-адрес в свой XML-файл, но SQL хочет заменить любой '&' на '&'
Возьмите следующий запрос:
SELECT 'http://foosite.com/' + RTRIM(li.imageStore)
+ '/ImageStore.dll?id=' + RTRIM(li.imageID)
+ '&raw=1&rev=' + RTRIM(li.imageVersion) AS imageUrl
FROM ListingImages li
FOR XML PATH ('image'), ROOT ('images'), TYPE
Результат, который я получаю, выглядит следующим образом (& s озаглавлены):
<images>
<image>
<imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl>
</image>
</images>
Я бы хотел, чтобы это (& s не имеет названия):
<images>
<image>
<imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl>
</image>
</images>
Как сделать так, чтобы SQL-сервер не означал "&" в "&"?


То, что генерирует SQL Server, правильно. То, что вы ожидаете увидеть, не является правильно сформированным XML. Причина в том, что символ & обозначает начало ссылки на объект, например &. См. Спецификация XML для получения дополнительной информации.
Когда ваш XML-синтаксический анализатор анализирует эту строку из XML, он распознает ссылки на сущности & и вернет текст обратно в нужной вам форме. Таким образом, внутренний формат в файле XML не должен вызывать у вас проблем, если вы не используете ошибочный синтаксический анализатор XML или не пытаетесь проанализировать его вручную (в этом случае ваш текущий код синтаксического анализатора на данный момент фактически содержит ошибки в отношении XML. Спецификация).
Бывают ситуации, когда человеку может не понадобиться хорошо сформированный XML - тот, с которым я (и, возможно, исходный плакат) столкнулся, использовал технику For XML Path для возврата одного списка полей «дочерних» элементов через рекурсивный запрос. Более подробная информация об этом методе находится здесь (в частности, в разделе «XML-методы черного ящика»): Объединение значений строк в Transact-SQL
Для меня то, что «H&E» (пятно патологии) превратилось в «правильно сформированный XML», было настоящим разочарованием. К счастью, я нашел решение ... следующая страница помогла мне решить эту проблему относительно легко и без перестройки моего рекурсивного запроса или добавления дополнительного синтаксического анализа на уровне презентации (для этого, а также для других / будущих ситуаций, когда мой ребенок -rows поля данных содержат зарезервированные символы XML): Обработка специальных символов с помощью FOR XML PATH
Обновлено: код ниже из указанного сообщения в блоге.
select
stuff(
(select ', <' + name + '>'
from sys.databases
where database_id > 4
order by name
for xml path(''), root('MyString'), type
).value('/MyString[1]','varchar(max)')
, 1, 2, '') as namelist;
Решение Роба Фарли больше не появляется, страница просто сидит там и загружается бесконечно. Может кто-нибудь, пожалуйста, опубликуйте решение? Вот почему ссылки на сайты других людей не являются постоянным решением.
Спасибо, мне это помогло. Я просто использую FOR XML PATH для объединения строк. Я не хочу & amp;
Обратите внимание, что ключевое слово STUFF не имеет отношения к удалению амперсанда, но используется для удаления начальной запятой.
Не понимаю, как это работает - это было бы хорошим дополнением для объяснения решения - но это работает.
Попробуй это....
select
stuff(
(select ', <' + name + '>'
from sys.databases
where database_id > 4
order by name
for xml path(''), root('MyString'), type
).value('/MyString[1]','varchar(max)')
, 1, 2, '') as namelist;
Обратите внимание, что ключевое слово STUFF не имеет отношения к удалению амперсанда, но используется для удаления начальной запятой.
Это было то, что я искал. Спасибо.