Как сохранить амперсанд (&) при использовании FOR XML PATH в SQL 2005

Есть ли какие-нибудь уловки для предотвращения того, чтобы SQL Server давал права таким символам, как &, <и>? Я пытаюсь вывести URL-адрес в свой XML-файл, но SQL хочет заменить любой '&' на '&amp;'

Возьмите следующий запрос:

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&amp;raw=1&amp;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-сервер не означал "&" в "&amp;"?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
33
0
38 783
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

То, что генерирует SQL Server, правильно. То, что вы ожидаете увидеть, не является правильно сформированным XML. Причина в том, что символ & обозначает начало ссылки на объект, например &amp;. См. Спецификация XML для получения дополнительной информации.

Когда ваш XML-синтаксический анализатор анализирует эту строку из XML, он распознает ссылки на сущности &amp; и вернет текст обратно в нужной вам форме. Таким образом, внутренний формат в файле 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;

Это было то, что я искал. Спасибо.

Bob 22.03.2012 20:18

Решение Роба Фарли больше не появляется, страница просто сидит там и загружается бесконечно. Может кто-нибудь, пожалуйста, опубликуйте решение? Вот почему ссылки на сайты других людей не являются постоянным решением.

Isaac 06.10.2015 20:09

Спасибо, мне это помогло. Я просто использую FOR XML PATH для объединения строк. Я не хочу & amp;

BrianK 09.03.2018 20:43

Обратите внимание, что ключевое слово STUFF не имеет отношения к удалению амперсанда, но используется для удаления начальной запятой.

gordon613 25.03.2018 19:46

Не понимаю, как это работает - это было бы хорошим дополнением для объяснения решения - но это работает.

youcantryreachingme 22.01.2020 06:07

Попробуй это....

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 не имеет отношения к удалению амперсанда, но используется для удаления начальной запятой.

gordon613 25.03.2018 19:46

Другие вопросы по теме