web-dev-qa-db-ja.com

文字列をxmlに変換し、SQLサーバーを挿入する

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エントリを含めることができます。

10
CodeNinja

これらすべてが機能するように、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))
24
Darek

これは私のために働きました:

select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table
3
DubMan