T-SQL에서 XML 문자열의 특성에서 큰 따옴표를 어떻게 이스케이프 처리합니까?


174

아주 간단한 질문-큰 따옴표로 묶고 싶은 속성이 있습니다. 어떻게 이스케이프 처리합니까? 난 노력 했어

  • \ "
  • ""
  • \\ "

그리고 @xml 변수를 xml 유형과 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
그건 그렇고 ... 여기에 openxml을 사용할 이유가 없습니다 (2005 년 이전). xml 값이 있으면 직접 xml로 사용하십시오.
Marc Gravell

마크-고맙습니다. openxml이 된 또 다른 버그가 곱슬 어포 스트로피로 파열되었습니다. 'Google에서 찾을 수있는 질문 / 답변으로 게시 할 것이라고 생각합니다.
Tom Ritter

답변:


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

그는 동의했지만, 그가하려는 일에 혼란이있을 경우를 대비하여 그것이 가능하다는 것을 증명하고 싶었습니다.
Joel Coehoorn

4

더 이상 주석을 달 수는 없지만 투표하고 &quot;Solr에서 RegexTransformer에 대한 정규 표현식을 형성 할 때 XML 구성 파일에 매우 효과적 이라는 것을 사람들에게 알리고 싶습니다 regex=".*img src=&quot;(.*)&quot;.*". 큰 따옴표 대신 이스케이프 된 버전을 사용하십시오.


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; 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.