Como escapar aspas duplas em atributos em uma String XML no T-SQL?

174

Pergunta bastante simples - tenho um atributo no qual gostaria de colocar aspas duplas. Como faço para escapar delas? eu tentei

  • \ "
  • ""
  • \\ "

E eu criei a variável @xml para o tipo xml e varchar (max) para todos eles.

 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
Tom Ritter
fonte
1
A propósito ... não há razão (AFAIK) para usar o openxml aqui ... isso é coisa "anterior a 2005". Se você tiver um valor xml, use-o como xml diretamente.
Marc Gravell
Marc - obrigado. Eu tinha outro bug que acabou sendo openxml e estava cheio de apóstrofos encaracolados: 'Acho que vou postá-lo como uma pergunta / resposta para o google encontrar.
21430 Tom Ritter

Respostas:

273

Isso não seria &quot;em xml? ie

"hi &quot;mom&quot; lol" 

** editar: ** testado; funciona bem:

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)')
Marc Gravell
fonte
4

O tSql escapa uma aspas duplas com outra aspas duplas. Portanto, se você quiser que ele faça parte de sua literal de string sql, faça o seguinte:

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

Se você deseja incluir uma cotação dentro de um valor no próprio xml, use uma entidade com a seguinte aparência:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Joel Coehoorn
fonte
4
É melhor não usar aspas duplas como delimitadores de string SQL. Aspas simples são padrão ANSI e sempre funcionam, independentemente da configuração QUOTED_IDENTIFIER.
bobince
Concordei, mas queria demonstrar que isso é possível, para o caso de haver alguma confusão sobre o que ele estava tentando fazer.
Joel Coehoorn
4

Não posso mais comentar, mas votei e queria que as pessoas soubessem que &quot;funciona muito bem para os arquivos de configuração xml ao formar expressões regex para RegexTransformer no Solr da seguinte forma: regex=".*img src=&quot;(.*)&quot;.*"usando a versão escapada em vez de aspas duplas.

pulkitsinghal
fonte
2

No Jelly.core para testar uma string literal, usaria-se:

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

Mas se eu tiver que verificar a string "Toy's R Us":

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

Seria assim, se as aspas duplas fossem permitidas dentro:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
Marca
fonte