XML構造があり、これは私のストアドプロシージャの入力パラメーターです。 &の要素が含まれます(XMLではエスケープされます)。その要素をVARCHAR
に抽出すると、有効なXML文字ではない&を受け取ります。もう一度XMLに変換する前に、それをエスケープする必要があります。 REPLACE
なしでそれを行うには?
次のテキストがあります:_param1=xyz¶2=dasdasdfdas¶m3
_。クエリ文字列の一部です。これをXML
に変換し、XML構造の一部として送信します。
_<zzz xmlns="http://example.com">
<aaa>aaa</aaa>
<bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>
_
ストアドプロシージャの内部で抽出する必要があります。私はそれをします:
_ISNULL(NULLIF(LTRIM(RTRIM(@XMLInput.value('declare default element namespace "http://example.com"; (zzz/bbb)[1]', 'NVARCHAR(250)'))), ''), '');
_
その後、値には通常のテキストが含まれます(&-sはエスケープされません-&)。
いくつかの処理の後、その文字列を他のXML内に配置する必要があります。私が作る:
CAST( ... AS XML);
&-sがエスケープされていないため、エラーが発生しました。
使用する for xml path
キャストの代わりにXMLを作成します。
select @YourVariable for xml path(''), type
パス式に空の文字列があり、返された列にエイリアスがない場合、文字列はxmlとして返されます。
これは完全に有効なXMLです。 XMLデータ型の.value
メソッドを使用してbbb
要素を抽出すると、その時点で要素の識別が解除されます。たとえば、
たとえば、XMLデータ型の.modify
メソッドを使用して、特別な処理や置換を行わずに要素を抽出および追加できます。
DECLARE @xml XML = '<zzz xmlns="http://example.com">
<aaa>aaa</aaa>
<bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>'
SELECT @xml [before], DATALENGTH(@xml) dl
DECLARE @b VARCHAR(100)
;WITH XMLNAMESPACES ( DEFAULT 'http://example.com' )
SELECT @b = @xml.value('(zzz/bbb/text())[1]', 'VARCHAR(100)')
SELECT @b
SET @xml.modify('declare default element namespace "http://example.com"; insert element bbb { sql:variable("@b") } after (zzz/bbb)[1]')
SELECT @xml [after], DATALENGTH(@xml) dl