適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
この記事では、無効な XML 文字が FOR XML 句でどのように処理されるのかを説明し、XML 名では無効になる文字のエスケープの規則を示します。
For XML と無効な文字
SQL Server では、無効な XML 文字が TYPE ディレクティブの指定されていない FOR XML クエリの結果として返される場合、これらの文字はエンティティに変換されます。
XML 1.0 準拠のパーサーは、これらの文字がエンティティであるかどうかにかかわらず解析エラーを返しますが、エンティティで表現すると XML 1.1 への準拠度が高くなります。 エンティティによる表現は、XML 標準の今後のバージョンでも推奨されると考えられます。 また、コード内で無効な文字を検出しやすくなるため、デバッグが容易になります。
XML ツールを使用している場合は、データ ストリーム中で無効な文字が見つかった場合は、どのような場合でも XML パーサーは失敗するので、対処する必要はありません。 XML 以外のツールを使用している場合は、エンティティとして表現すべき文字を検索するようにプログラミング ロジックを変更する必要が生じる可能性があります。
FOR XML クエリ内の以下の空白文字が情報のやり取りの間に失われないようにするため、異なるエンティティに変換されます。
要素のコンテンツおよび属性内:
hex(0D)(復帰)属性のコンテンツ内:
hex(09)(タブ)、hex(0A)(ライン フィード)
これらの文字は出力に保持され、パーサーはこれらの文字を正規化しません。
エスケープの規則
SQL Server の名前にスペースなどの XML では無効になる文字が含まれている場合、この名前は、無効な文字がエスケープ数値エンティティ エンコードに変換された XML 名に変換されます。
英字以外で XML 名に使用できる文字は、コロン (:) とアンダースコア (_) の 2 つだけです。 コロンは既に名前空間用に予約されているので、エスケープ文字としてはアンダースコアが使われます。 エンコードに使用されるエスケープの規則は、次のとおりです。
妥当な XML 名の文字ではない UCS-2 文字は、XML 1.0 の仕様に従って、
_xHHHH_としてエスケープされます。 このHHHHは、その文字の 4 桁の 16 進数 UCS-2 コードを最上位ビットから順に表しています。 たとえば、テーブル名Order DetailsはOrder_x0020_Detailsとしてエンコードされます。UCS-2 領域に適合しない文字 (U+00010000 ~ U+0010FFFF の範囲の UCS-4 追加分) は、
_xHHHHHHHH_のようにエンコードされます。 SQL Server 2000 以前の下位互換性モードで実行されている場合、このHHHHHHHHは、その文字の 8 桁の 16 進数 UCS-4 エンコードを表します。 それ以外の場合は、ISO 標準に合わせ、文字は_xHHHHHH_の形式でエンコードされます。アンダースコア文字は、その後に文字
xが続いていない場合はエスケープする必要はありません。 たとえば、テーブル名Order_Detailsはエンコードされていません。識別子のコロンはエスケープされません。 このため、FOR XML クエリで名前空間の要素と属性名を生成できます。 たとえば、次のクエリでは名前にコロンが含まれる名前空間属性が生成されます。
SELECT 'namespace-urn' as 'xmlns:namespace', 1 as 'namespace:a' FOR XML RAW;クエリの結果は以下のとおりです。
<row xmlns:namespace="namespace-urn" namespace:a="1"/>XML 名前空間を追加する場合は、WITH XMLNAMESPACES を使用することをお勧めします。