適用対象:
SQL Server
Azure SQL データベース
SQL Server へは、いくつかの方法で XML データを転送できます。 次に例を示します。
SQL Server データベースの [n]text 型または image 型の列にデータが含まれている場合、統合サービスを使用してテーブルをインポートできます。 ALTER TABLE ステートメントを使用して列の型を XML に変更します。
bcp out を使用して別の SQL Server データベースからデータの一括コピーを実行し、bcp in を使用して新しいバージョンのデータベースにそのデータの一括挿入を実行できます。
SQL Server データベースのリレーショナル列にデータが含まれている場合、新しいテーブルを作成し、[n]text 型の列や行 ID を保存する主キー列 (任意) を含めます。 クライアント側プログラミングを使用して、FOR XML によりサーバーで生成された XML を取得し、 [n]text 型の列に書き込みます。 その後で、既に説明した技法により、新しいバージョンのデータベースにデータを転送します。 XML を新しいバージョンのデータベースの XML 列に直接書き込むこともできます。
bcp など、SQL Server の一括読み込み機能によって XML データをサーバーに一括で読み込むことができます。 OPENROWSET を使用すると、ファイルから XML 列にデータを読み込むことができます。 次の例は、この点を示しています。
この例では、テーブル T に行を挿入する方法を示します。ファイル C:\MyFile\xmlfile.xml
から CLOB として XML 列の値を読み込み、整数型の列に値 10 を保存します。
INSERT INTO T
SELECT 10, xCol
FROM (SELECT *
FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_BLOB)
AS xCol) AS R(xCol);
SQL Server では XML データを Unicode (UTF-16) で保存します。 サーバーから取得する XML データは UTF-16 エンコードで出力されます。 それ以外のエンコードが必要な場合、取得したデータに必要な変換を行う必要があります。 変換した XML データのエンコードが異なる場合があります。 その場合は、注意してデータを読み込む必要があります。 次に例を示します。
Unicode (UCS-2、UTF-16) のテキスト XML は、問題なく XML 列、変数、またはパラメーターに代入できます。
基になるコード ページの都合で Unicode ではなく、ソース コード ページによって暗黙的に決まる場合、データベースの文字列のコード ページは読み込むコード ポイントと同一か、互換性がある必要があります。 必要に応じて、COLLATE を使用します。 サーバーにそのようなコード ページが存在しない場合、エンコードを修正する明示的な XML 宣言を追加する必要があります。
明示的なエンコードを使用するには、コード ページに連動しない varbinary() 型を使用するか、適切なコード ページの文字列型を使用します。 次に、データを XML の列、変数、またはパラメーターに割り当てます。
明示的な XML 宣言が行われていない XML ドキュメント vcdoc を varchar(max) として保存しているとします。 次のステートメントは、エンコード "iso8859-1" を指定した XML 宣言を追加し、この XML ドキュメントを宣言に連結します。バイト表現を保持するために結果を varbinary(max) にキャストし、最終的にその結果を XML にキャストします。 その結果、XML プロセッサで、指定したエンコード "iso8859-1" に従ってデータを解析し、対応する文字列値の UTF-16 表現を生成できます。
SELECT CAST(
CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX))
AS XML);
XML をコピーし、文字列リテラルとして SQL Server Management Studio のクエリ エディター ウィンドウに貼り付けると、[N]VARCHAR 文字列エンコードの非互換性の問題が発生する可能性があります。 この問題が発生するかどうかは、XML インスタンスのエンコードによって決まります。 多くの場合、XML 宣言の削除が必要になります。 次に例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema ...
その後、XML インスタンスを Unicode のインスタンスにするために、文字列の前に N
を付ける必要があります。 次に例を示します。
-- Assign XML instance to a variable.
DECLARE @X XML
SET @X = N'...'
-- Insert XML instance into an xml type column.
INSERT INTO T VALUES (N'...')
-- Create an XML schema collection
CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ... '