T-SQL OpenXMLが特定の文字で失敗するのはなぜですか?
質問
SQL Serverで実行している次のXMLがあり、それが壊れているのはなぜですか?
declare @xml varchar(max)
declare @hDoc int
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
<item itemId="5" value="Hello ’World" />
</transaction>'
exec sp_xml_preparedocument @hDoc OUTPUT, @xml
select
itemId
, value
from
openxml(@hDoc, '/transaction/item')
with (
itemId int,
value varchar(max)
) item
解決
XMLの値に無効な文字が含まれています。一般的にXMLの場合、次のように小なり記号とアンパサンドをエスケープする必要があります。<!> amp; lt;および<!> amp; amp;
declare @xml varchar(max)
declare @hDoc int
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
</transaction>'
exec sp_xml_preparedocument @hDoc OUTPUT, @xml
select
itemId
, value
from
openxml(@hDoc, '/transaction/item')
with (
itemId int,
value varchar(max)
) item
ただし、openxmlを使用する場合、特定の値、特にその中のアポストロフィは一般に機能しません。どの値が無効かはわかりませんが、それがその1つであることは知っています。したがって、解決策は、SQL Server 2005でネイティブXML型を使用することです。
declare @xml xml
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
<item itemId="5" value="Hello ’World" />
</transaction>'
select
item.value('@itemId', 'int')
, item.value('@value', 'varchar(max)')
from @xml.nodes('/transaction/item') [transaction](item)
他のヒント
可能であれば、アプリケーションでXMLドキュメントを組み立てます。フレームワーク(.Net、Java、...?)は適切なオンコーディングを行い、有効なXMLを生成します。
所属していません StackOverflow