XML ドキュメントの一括インポートと一括エクスポートの例 (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)

適用対象: ○SQL Server (2016 以降) XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2016) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

XML ドキュメントは、SQL ServerSQL Server データベースに一括インポートすることも、SQL ServerSQL Server データベースから一括エクスポートすることもできます。You can bulk import XML documents into a SQL ServerSQL Server database or bulk export them from a SQL ServerSQL Server database. このトピックではその両方の例を示します。This topic provides examples of both.

データ ファイルから SQL ServerSQL Server のテーブルまたはパーティション分割されていないビューにデータを一括インポートする場合、次の機能を使用できます。To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

  • bcp ユーティリティbcp utility
    bcp ユーティリティは、パーティション分割されたビューを含めて、 SQL ServerSQL Server データベースで SELECT ステートメントが機能する任意の場所からデータをエクスポートするためにも使用できます。You can also use the bcp utility to export data from anywhere in a SQL ServerSQL Server database that a SELECT statement works, including partitioned views.

  • BULK INSERTBULK INSERT

  • INSERT ...SELECT * FROM OPENROWSET(BULK...)INSERT ... SELECT * FROM OPENROWSET(BULK...)

詳細については、次の各トピックを参照してください。For more information, see the following topics.

使用例Examples

次に例を示します。The examples are the following:

バイナリ バイト ストリームとして XML の一括インポートを行うBulk importing XML data as a binary byte stream

適用するエンコード宣言が含まれているファイルから XML データの一括インポートを行うときは、OPENROWSET(BULK...) 句で SINGLE_BLOB オプションを指定します。When you bulk import XML data from a file that contains an encoding declaration that you want to apply, specify the SINGLE_BLOB option in the OPENROWSET(BULK...) clause. SINGLE_BLOB オプションが指定されていると、 SQL ServerSQL Server の XML パーサーは必ず XML 宣言で指定されたエンコード体系に従ってデータをインポートします。The SINGLE_BLOB option ensures that the XML parser in SQL ServerSQL Server imports the data according to the encoding scheme specified in the XML declaration.

サンプル テーブルSample Table

例 A をテストするには、サンプル テーブル Tを作成します。To test example A below, create sample table T.

USE tempdb  
CREATE TABLE T (IntCol int, XmlCol xml);  
GO  

サンプル データ ファイルSample Data File

例 A を実行する前に、次のサンプル インスタンスが指定するC:\SampleFolder\SampleData3.txtエンコード体系を含む、UTF-8 エンコードのファイル ( UTF-8 ) を作成する必要があります。Before you can run example A, you must create a UTF-8 encoded file (C:\SampleFolder\SampleData3.txt) that contains the following sample instance that specifies the UTF-8 encoding scheme.

<?xml version="1.0" encoding="UTF-8"?>  
<Root>  
          <ProductDescription ProductModelID="5">  
             <Summary>Some Text</Summary>  
          </ProductDescription>  
</Root>  

例 AExample A

この例では、 SINGLE_BLOB オプションを INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントで使用して、 SampleData3.txt という名前のファイルからデータをインポートし、XML インスタンスを 1 列のテーブル (サンプル テーブル T) に挿入します。This example uses the SINGLE_BLOB option in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement to import data from a file named SampleData3.txt and insert an XML instance in the single-column table, sample table T.

INSERT INTO T(XmlCol)  
SELECT * FROM OPENROWSET(  
   BULK 'c:\SampleFolder\SampleData3.txt',  
   SINGLE_BLOB) AS x;  

RemarksRemarks

この場合に SINGLE_BLOB を使用すると、XML エンコード宣言で指定されている XML ドキュメントのエンコードと、サーバーによって暗黙的に示されている文字列のコード ページとの不一致を回避できます。By using SINGLE_BLOB in this case, you can avoid a mismatch between the encoding of the XML document (as specified by the XML encoding declaration) and the string codepage implied by the server.

NCLOB または CLOB データ型を使用した際にコード ページまたはエンコードの競合が発生する場合は、次のいずれかの操作を行う必要があります。If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • XML データ ファイルの内容を正常にインポートできるように、XML 宣言を削除します。Remove the XML declaration to successfully import the contents of the XML data file.

  • XML 宣言で使用されているエンコード体系に一致するコード ページを、クエリの CODEPAGE オプションに指定します。Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • データベースの照合順序の設定を Unicode 以外の XML エンコード体系に一致 (解決) させます。Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

[先頭に戻る][Top]

既存の行に XML データの一括インポートを行うBulk importing XML data in an existing row

この例では OPENROWSET 一括行セット プロパイダを使用して、XML インスタンスを既存のサンプル テーブル Tの 1 行または複数の行に追加します。This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

注意

この例を実行するには、まず例 A で提供されたテスト スクリプトを完了する必要があります。例 A では、 tempdb.dbo.T テーブルを作成し、 SampleData3.txtからデータを一括インポートをしています。To run this example, you must first complete the test script provided in example A. That example creates the tempdb.dbo.T table and bulk imports data from SampleData3.txt.

サンプル データ ファイルSample Data File

例 B では、例 A の SampleData3.txt サンプル データ ファイルを変更したバージョンを使用します。Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. 例 B を実行するには、このファイルの内容を次のように修正します。To run this example, modify the content of this file as follows:

<Root>  
          <ProductDescription ProductModelID="10">  
             <Summary>Some New Text</Summary>  
          </ProductDescription>  
</Root>  

例 BExample B

-- Query before update shows initial state of XmlCol values.  
SELECT * FROM T  
UPDATE T  
SET XmlCol =(  
SELECT * FROM OPENROWSET(  
   BULK 'C:\SampleFolder\SampleData3.txt',  
           SINGLE_BLOB  
) AS x  
)  
WHERE IntCol = 1;  
GO  

[先頭に戻る][Top]

DTD を含むファイルから XML データの一括インポートを行うBulk importing XML data from a file that contains a DTD

重要

作業中の XML 環境で DTD (文書型定義) が特に必要ではない場合は、DTD のサポートを無効にしておくことをお勧めします。We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. DTD のサポートを有効にすると、使用しているサーバーが外部からの攻撃を受けやすくなり、サービス拒否攻撃の危険にさらされる場合があります。Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. DTD のサポートを有効にする必要がある場合は、信頼できる XML ドキュメントのみを処理することにより、このセキュリティ上のリスクを軽減できます。If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

bcp コマンドを使用して、DTD を含むファイルから XML データのインポートを試みた場合に、次に示すようなエラーが表示されることがあります。During an attempt to use a bcp command to import XML data from a file that contains a DTD, an error similar to the following can occur:

"SQLState = 42000, NativeError = 6359""SQLState = 42000, NativeError = 6359"

"エラー = [Microsoft][SQL Server Native Client][SQL Server]内部サブセット DTD を使用した XML の解析は許可されません。"Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. スタイル オプション 2 を設定して CONVERT を使用し、制限付きの内部サブセット DTD のサポートを有効にしてください。"Use CONVERT with style option 2 to enable limited internal subset DTD support."

"BCP コピー %s が失敗しました""BCP copy %s failed"

この問題を回避するには、XML データを DTD を含むデータ ファイルからインポートする際に OPENROWSET(BULK...) 関数を使用し、コマンドの CONVERT 句内で SELECT オプションを指定します。To work around this problem, you can import XML data from a data file that contains a DTD by using the OPENROWSET(BULK...) function and then specifying the CONVERT option in the SELECT clause of the command. コマンドの基本構文を次に示します。The basic syntax for the command is:

INSERT ... SELECT CONVERT(...) FROM OPENROWSET(BULK...)

サンプル データ ファイルSample Data File

一括インポートの例をテストする前に、次のサンプル インスタンスを含むファイル (C:\temp\Dtdfile.xml) を作成します。Before you can test this bulk import example, create a file (C:\temp\Dtdfile.xml) that contains the following sample instance:

<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>  

サンプル テーブルSample Table

例 C では、次の T1 ステートメントで作成した CREATE TABLE サンプル テーブルを使用します。Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE T1(XmlCol xml);  
GO  

例 CExample C

この例では OPENROWSET(BULK...) を使用して、 CONVERT 句内で SELECT オプションを指定し、 Dtdfile.xml から XML データをサンプル テーブル T1にインポートします。This example uses OPENROWSET(BULK...) and specifies the CONVERT option in the SELECT clause to import the XML data from Dtdfile.xml into sample table T1.

INSERT T1  
  SELECT CONVERT(xml, BulkColumn, 2) FROM   
    OPENROWSET(Bulk 'c:\temp\Dtdfile.xml', SINGLE_BLOB) [rowsetresults];  

INSERT ステートメントの実行後、DTD が XML から分離され、テーブル T1 に格納されます。After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[先頭に戻る][Top]

フォーマット ファイルを使用してフィールド ターミネータを明示的に指定するSpecifying the field terminator explicitly using a format file

次の例では、XML ドキュメント Xmltable.datを一括インポートする方法を示します。The following example shows how to bulk import the following XML document, Xmltable.dat.

サンプル データ ファイルSample Data File

Xmltable.dat のドキュメントには 2 つの XML 値が、1 行に 1 つずつ含まれています。The document in Xmltable.dat contains two XML values, one for each row. 最初の XML 値は UTF-16 でエンコードされており、2 番目の値は UTF-8 でエンコードされています。The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

このデータの内容を 16 進形式でダンプすると次のようになります。The contents of this data file are shown in the following Hex dump:

FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00  *..\<.?.x.m.l. .v.*  
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00  *e.r.s.i.o.n.=.".*  
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00  *1...0.". .e.n.c.*  
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00  *o.d.i.n.g.=.".u.*  
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00  *t.f.-.1.6.".?.>.*  
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76  *\<.r.o.o.t.>..O.v*  
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E  *..w.............*  
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3  *.4.4..... ..N...*  
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00  *4.........\<./.r.*  
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF  *o.o.t.>.....z...*  
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31  *\<?xml version="1*  
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74  *.0" encoding="ut*  
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7  *f-8"?><root>....*  
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90  *................*  
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83  *................*  
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E  *................*  
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E  *.........</root>*  
00 00 00 00 7A                                   *....z*  

サンプル テーブルSample Table

XML ドキュメントの一括インポートまたは一括エクスポートを行う際には、いずれのドキュメントにも記述されていない フィールド ターミネータ を使用する必要があります。たとえば、一連の 4 つの Null (\0) の後に文字 zを付けた、 \0\0\0\0zなどです。When you bulk import or export an XML document, you should use a field terminator that cannot possibly appear in any of the documents; for example, a series of four nulls (\0) followed by the letter z: \0\0\0\0z.

この例では、サンプル テーブル xTable のフィールド ターミネータの使用方法を示します。This example shows how to use this field terminator for the xTable sample table. サンプル テーブルを作成するには、次の CREATE TABLE ステートメントを使用します。To create this sample table, use the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE xTable (xCol xml);  
GO  

サンプル フォーマット ファイルSample Format File

フィールド ターミネータは、フォーマット ファイルで指定する必要があります。The field terminator must be specified in the format file. 例 D では、次の内容を含む Xmltable.fmt という XML 以外のフォーマット ファイルを使用します。Example D uses a non-XML format file named Xmltable.fmt that contains the following:

9.0  
1  
1       SQLBINARY     0       0       "\0\0\0\0z"    1     xCol         ""  

このフォーマット ファイルを使用し、 xTable コマンドか、 bcp ステートメントまたは BULK INSERT ステートメントを使って、XML ドキュメントをテーブル INSERT ... SELECT * FROM OPENROWSET(BULK...) に一括インポートできます。You can use this format file to bulk import XML documents into the xTable table by using a bcp command or a BULK INSERT or INSERT ... SELECT * FROM OPENROWSET(BULK...) statement.

例 DExample D

この例では、 Xmltable.fmt ステートメントで BULK INSERT フォーマット ファイルを使用して、 Xmltable.datという XML データ ファイルの内容をインポートします。This example uses the Xmltable.fmt format file in a BULK INSERT statement to import the contents of an XML data file named Xmltable.dat.

BULK INSERT xTable   
FROM 'C:\Xmltable.dat'  
WITH (FORMATFILE = 'C:\Xmltable.fmt');  
GO  

[先頭に戻る][Top]

XML データの一括エクスポートを行うBulk exporting XML data

次の例では、 bcp を使用し、同じ XML フォーマット ファイルを使用して、前の例で作成されたテーブルから XML データの一括エクスポートを行います。The following example uses bcp to bulk export XML data from the table that is created in the preceding example by using the same XML format file. 次の bcp コマンドで、 <server_name><instance_name> はプレースホルダーであり、適切な値との差し替えが必要です。In the following bcp command, <server_name> and <instance_name> represent placeholders that must be replaced with appropriate values:

bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>  

注意

SQL ServerSQL Server XML データがデータベース内に保存されるときに、 では XML エンコードが保存されません。does not save the XML encoding when XML data is persisted in the database. したがって、XML データをエクスポートするときは、XML フィールドの元のエンコードは使用できません。Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server は XML データをエクスポートする際に UTF-16 エンコードを使用します。uses UTF-16 encoding when exporting XML data.

参照See Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
SELECT 句 (Transact-SQL) SELECT Clause (Transact-SQL)
bcp ユーティリティ bcp Utility
データの一括インポートと一括エクスポート (SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)OPENROWSET (Transact-SQL)