Как сохранить амперсанд (&) при использовании FOR XML PATH в SQL 2005 - PullRequest
28 голосов
/ 07 ноября 2008

Существуют ли какие-либо приемы для предотвращения предоставления 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;'?

Ответы [ 3 ]

53 голосов
/ 31 декабря 2011

Существуют ситуации, когда человеку может не потребоваться правильно сформированный XML - тот, с которым я (и, возможно, оригинальный автор) столкнулся, использовал технику For XML Path, чтобы возвратить список с одним полем «дочерних» элементов через рекурсивный запрос. Более подробная информация об этом методе находится здесь (в частности, в разделе «XML-методы черного ящика»): Объединение значений строк в Transact-SQL

Для моей ситуации видение «H & E» (пятно патологии), преобразованного в «хорошо сформированный XML», было настоящим разочарованием. К счастью, я нашел решение ... следующая страница помогла мне относительно легко решить эту проблему без необходимости повторной архитектуры моего рекурсивного запроса или добавления дополнительного анализа на уровне представления (для этого, а также для других / будущих ситуаций, когда мой ребенок поля данных (содержат зарезервированные символы 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;
10 голосов
/ 07 ноября 2008

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

Когда ваш синтаксический анализатор XML анализирует эту строку из XML, он поймет ссылки на сущность &amp; и вернет текст обратно в нужной форме. Таким образом, внутренний формат файла XML не должен вызывать у вас проблемы, если вы не используете глючный синтаксический анализатор XML или не пытаетесь проанализировать его вручную (в этом случае ваш текущий код синтаксического анализатора в настоящее время эффективно глючит в отношении XML спецификация).

4 голосов
/ 08 апреля 2014

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...