Как избежать двойных кавычек в атрибутах в XML-строке в T-SQL?

174

Довольно простой вопрос - у меня есть атрибут, в котором я хотел бы иметь двойные кавычки. Как мне избежать их? я пробовал

  • «»
  • \\»

И я сделал переменную @xml как xml type, так и varchar (max) для всех них.

 declare @xml xml --(or varchar(max) tried both)

 set @xml = '<transaction><item value="hi "mom" lol" 
    ItemId="106"  ItemType="2"  instanceId="215923801"  dataSetId="1" /></transaction>'

 declare @xh int
 exec sp_xml_preparedocument @xh OUTPUT, @xml

 insert into @commits --I declare the table, just removed it for brevity
 select
    x.*
 from openxml(@xh,'/transaction/item')
  WITH (
    dataItemId int,
     dataItemType int,
    instanceId int,
    dataSetId int,
    value varchar(max)
  ) x
Том Риттер
источник
1
Кстати ... нет никакой причины (AFAIK) использовать openxml здесь ... это вещи "до 2005 года". Если у вас есть значение xml, используйте его как xml напрямую.
Марк Гравелл
Марк - Спасибо. У меня была еще одна ошибка, в результате которой openxml портился с вьющимися апострофами: «Я думаю, что опубликую это как вопрос / ответ для поиска в Google.
Том Риттер

Ответы:

273

Разве это не будет &quot;в XML? т.е.

"hi &quot;mom&quot; lol" 

** редактировать: ** проверено; работает отлично:

declare @xml xml

 set @xml = '<transaction><item value="hi &quot;mom&quot; lol" 
    ItemId="106"  ItemType="2"  instanceId="215923801"  dataSetId="1" /></transaction>'

select @xml.value('(//item/@value)[1]','varchar(50)')
Марк Гравелл
источник
4

tSql избегает двойной кавычки с другой двойной кавычкой. Поэтому, если вы хотите, чтобы он был частью строкового литерала sql, вы бы сделали это:

declare @xml xml 
set @xml = "<transaction><item value=""hi"" /></transaction>"

Если вы хотите включить кавычку в значение в самом xml, вы используете сущность, которая будет выглядеть следующим образом:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Джоэл Коухорн
источник
4
Лучше не использовать двойные кавычки в качестве разделителей строк SQL. Одинарные кавычки являются стандартом ANSI и всегда работают независимо от значения параметра QUOTED_IDENTIFIER.
bobince
Согласился, но я хотел продемонстрировать, что это возможно, на случай, если возникнет путаница в том, что он пытается сделать.
Джоэл Коухорн
4

Больше не могу комментировать, но проголосовал за это и хотел, чтобы люди знали, что это &quot;очень хорошо работает для файлов конфигурации xml при формировании выражений регулярных выражений для RegexTransformer в Solr следующим образом: regex=".*img src=&quot;(.*)&quot;.*"использование экранированной версии вместо двойных кавычек.

pulkitsinghal
источник
2

В Jelly.core для проверки литеральной строки можно использовать:

&lt;core:when test="${ name == 'ABC' }"&gt; 

Но если мне нужно проверить строку «Toy's R Us»:

&lt;core:when test="${ name == &amp;quot;Toy&apos;s R Us&amp;quot; }"&gt;

Было бы так, если бы внутри были разрешены двойные кавычки:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
отметка
источник