XMLがVARCHAR
データ型の列に格納されたSQL Server 2008 R2データベーステーブルがあります。
次に、xmlの要素の一部をフェッチする必要があります。
したがって、最初にVARCHAR
データ型として格納されているxmlを、xml
データ型として格納されているxmlに変換します。
例:
テーブルA
_Id(int) , ProductXML (varchar(max))
_
表B
_Id(int), ProductXML(XML)
_
ProductXML
を_Table A
_からXMLデータ型に変換し、_Table B
_に挿入します。
以下に示すように、CAST()
およびCONVERT()
関数を使用してみました。
_insert into TableB (ProductXML)
select CAST(ProductXML as XML) from TableA;
_
同様に変換しようとしましたが、エラーが発生します
XML解析:エンコードを切り替えることができません
テーブルのvarchar
エントリをXMLエントリに変換する方法はありますか?
XMLについて:それは多くのノードを持つ巨大であり、その構造は動的に変化します。
例:1つの行に1つの製品のXMLエントリを含めることができ、別の行に複数の製品のxmlエントリを含めることができます。
これらすべてが機能するように、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は、XMLをUTF-16エンコーディングを使用する効率的なバイナリ表現で内部的に表現します。ユーザー指定のエンコードは保持されませんが、解析プロセス中に考慮されます。
ソリューション:
CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))
これは私のために働きました:
select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table