これらはすべて機能するため、XML のサンプルをお送りください。
CONVERT(XML, '<root><child/></root>')
CONVERT(XML, '<root> <child/> </root>', 1)
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML)
また、最初に nvarchar または varbinary にキャストする必要がある場合があります (Microsoft のドキュメントから)。
[n][var]char、[n]text、varbinary、image などの SQL Server 文字列データ型は、文字列をキャスト (CAST) または変換 (CONVERT) して xml データ型に解析できます。 xml データ型。型指定されていない XML がチェックされ、整形式であることが確認されます。xml 型に関連付けられたスキーマがある場合は、検証も実行されます。詳細については、型付き XML と型なし XML の比較を参照してください。
XML ドキュメントは、さまざまなエンコーディング (UTF-8、UTF-16、windows-1252 など) でエンコードできます。以下は、文字列およびバイナリ ソース タイプが XML ドキュメント エンコーディングとどのように相互作用するか、およびパーサーがどのように動作するかに関する規則の概要を示しています。
nvarchar は UTF-16 や UCS-2 などの 2 バイトの Unicode エンコーディングを想定しているため、XML パーサーは文字列値を 2 バイトの Unicode でエンコードされた XML ドキュメントまたはフラグメントとして扱います。これは、ソース データ型と互換性を保つために、XML ドキュメントを 2 バイトの Unicode エンコーディングでエンコードする必要があることを意味します。UTF-16 でエンコードされた XML ドキュメントには UTF-16 バイト オーダー マーク (BOM) を含めることができますが、その必要はありません。これは、ソース タイプのコンテキストから、2 バイトの Unicode でエンコードされたドキュメントのみであることが明らかになっているためです。
varchar 文字列の内容は、XML パーサーによって 1 バイトのエンコードされた XML ドキュメント/フラグメントとして扱われます。varchar ソース文字列にはコード ページが関連付けられているため、XML 自体で明示的なエンコーディングが指定されていない場合、パーサーはそのコード ページをエンコーディングに使用します。XML インスタンスに BOM またはエンコーディング宣言がある場合、BOM または宣言はコード ページと一致していない場合、パーサーはエラーを報告します。
varbinary の内容は、XML パーサーに直接渡されるコードポイント ストリームとして扱われます。したがって、XML ドキュメントまたはフラグメントは、BOM またはその他のエンコーディング情報をインラインで提供する必要があります。パーサーは、エンコーディングを決定するためにストリームのみを調べます。つまり、UTF-16 でエンコードされた XML は UTF-16 BOM を提供する必要があり、BOM がなく、宣言のエンコーディングがないインスタンスは UTF-8 として解釈されます。
XML ドキュメントのエンコーディングが事前にわからず、XML にキャストする前にデータが XML データではなく文字列またはバイナリ データとして渡される場合は、データを varbinary として扱うことをお勧めします。たとえば、OpenRowset() を使用して XML ファイルからデータを読み取る場合、読み取るデータを varbinary(max) 値として指定する必要があります。
select CAST(x as XML)
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)
SQL Server は内部的に、UTF-16 エンコーディングを使用する効率的なバイナリ表現で XML を表します。ユーザー指定のエンコーディングは保持されませんが、解析プロセス中に考慮されます。
解決:
CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))