XML データの読み込み
適用対象: 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 列に直接書き込むこともできます。
XML データの一括読み込み
bcp など、SQL Server の一括読み込み機能によって XML データをサーバーに一括で読み込むことができます。 OPENROWSET を使用すると、ファイルから XML 列にデータを読み込むことができます。 次の例は、この点を示しています。
例: ファイルから 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 ... '