一括インポート操作と一括エクスポート操作について

SQL Server では、SQL Server テーブルからのデータの一括エクスポート、および SQL Server テーブルまたはパーティション分割されていないビューへのデータの一括インポートがサポートされています。使用できる基本的な方法を次に示します。

方法

説明

データのインポート

データのエクスポート

bcp ユーティリティ

データの一括エクスポートと一括インポート、およびフォーマット ファイルの生成を行うコマンド ライン ユーティリティ (Bcp.exe)。

BULK INSERT ステートメント

データ ファイルのデータをデータベース テーブルまたはパーティション分割されていないビューに直接インポートする Transact-SQL ステートメント。

×

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

INSERT ステートメントでデータを選択するために OPENROWSET(BULK...) 関数を指定することによって、OPENROWSET 一括行セット プロバイダーを使用してデータを SQL Server テーブルに一括インポートする Transact-SQL ステートメント。

×

制限事項

SQL Server の一括インポート操作では、コンマ区切り値 (CSV) ファイルからのデータのインポートがサポートされていません。ただし、32 ビット システムでは、OPENROWSETOLE DB Provider for Jet と共に使用することにより、一括インポートの最適化を使用せずに CSV データを SQL Server テーブルにインポートできます。Jet は、データ ソースと同じディレクトリ内にある schema.ini ファイルで定義されたスキーマを使用して、テキスト ファイルをテーブルとして扱います。CSV データの場合、schema.ini ファイル内のパラメーターの 1 つが "FORMAT=CSVDelimited" となります。この解決方法を使用するには、Jet Test IISAMm 操作、その接続文字列の構文、schema.ini の使用法、レジストリ設定オプションなどについて理解する必要があります。この情報については、Microsoft Access ヘルプとサポート技術情報 (KB) の資料を参照することをお勧めします。詳細については、「テキスト データ ソース ドライバーを初期化する」、「HOWTO: セキュリティ設定された Access データベースへのリンク サーバーを指定した SQL Server 7.0 分散クエリ」、「Jet OLE DB プロバイダー 4.0 を使用して ISAM データベースに接続する方法」、および「Jet プロバイダーの Text IIsam を使用して区切り記号付きテキスト ファイルを開く方法」を参照してください。

インプロセス操作とアウト プロセス操作

BULK INSERT ステートメントおよび OPENROWSET(BULK) 関数は、SQL Server と同一のメモリ アドレス空間を共有してインプロセスで実行されます。データ ファイルが SQL Server プロセスによって開かれるので、クライアント プロセスと SQL Server プロセスとの間でデータのコピーは行われません。BULK INSERT または INSERT ... SELECT * FROM OPENROWSET(BULK...) を使用してデータをインポートする際のセキュリティに関する考慮事項については、「BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート」を参照してください。

一方、bcp ユーティリティはアウト プロセスで実行されます。bcp を使用してプロセス メモリ領域の間でデータを移動するには、プロセス間のデータ マーシャリングを使用する必要があります。プロセス間のデータ マーシャリングは、メソッド呼び出しのパラメーターをバイト ストリームに変換するプロセスです。このプロセスにより、プロセッサに大きな負荷がかかる場合があります。ただし、bcp では、クライアント プロセスでデータを解析しネイティブの保存形式に変換するので、SQL Server プロセスの解析とデータ変換にかかる負荷が軽減される場合があります。そのため、CPU に制約がある場合は、BULK INSERT または INSERT ... SELECT * FROM OPENROWSET(BULK) を使用するのではなく bcp を使用することにより、複数個の CPU が搭載された 1 台のコンピューターか複数の異なるコンピューターで、一括インポートのパフォーマンスが向上することがあります。

フォーマット ファイル

bcp ユーティリティ、BULK INSERT、および INSERT ... SELECT * FROM OPENROWSET(BULK...) では、フォーマット ファイルという特殊なファイルを使用して、データ ファイル内のフィールドごとにフォーマット情報を格納することができます。また、フォーマット ファイルには、対応する SQL Server テーブルに関する情報が含まれる場合もあります。フォーマット ファイルは、SQL Server のインスタンスからデータを一括エクスポートしたり、このインスタンスにデータを一括インポートしたりするのに必要なすべてのフォーマット情報を指定するために使用できます。

フォーマット ファイルを使用すると、インポートの際にデータ ファイルの形式に従ってデータを解釈したり、エクスポートの際にデータ ファイル内のデータに形式を適用する処理を柔軟に行えるようになります。これにより、SQL Server または外部アプリケーションの特定の必要性に応じてデータの解釈や再フォーマットを行うことだけを目的としたプログラムを作成する必要がなくなります。たとえば、コンマ区切り値が必要なアプリケーションに読み込まれるデータを一括インポートする場合、フォーマット ファイルを使用すると、エクスポートされたデータにフィールド ターミネータとしてコンマを挿入できます。

SQL Server 2005 以降のバージョンでは、XML フォーマット ファイルと XML 以外のフォーマット ファイルの 2 種類がサポートされます。XML 以外のフォーマット ファイルは、SQL Server の以前のバージョンでもサポートされていますが、XML フォーマット ファイルは SQL Server 2005 で新たにサポートされました。

フォーマット ファイルを生成できるツールは、bcp ユーティリティだけです。詳細については、「フォーマット ファイルの作成」を参照してください。フォーマット ファイルの詳細については、「データのインポートまたはエクスポート用のフォーマット ファイル」を参照してください。

注意

一括エクスポート操作または一括インポート操作でフォーマット ファイルが正しく提供されなかった場合に備えて、ユーザーはコマンド ラインで既定の形式を上書きすることもできます。

クエリ プロセッサと一括インポート

データを SQL Server のインスタンスに一括インポートする際には、bcp ユーティリティ、BULK INSERT ステートメント、および INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントがすべてクエリ プロセッサと連動して機能します。

これら 3 つのどの方法でも、データ ファイル内のデータは OLE DB の行セットに変換されます。ただし、変換方法は次のように異なります。

  • bcp ユーティリティはデータ ファイルを読み取り、SQL Server の一括コピー プログラム (BCP) API に TDS ストリームを送信します。すると、この API によってデータが OLE DB の行セットに変換されます。

  • BULK INSERT および OPENROWSET 一括行セット プロバイダーはどちらも、ファイル データを OLE DB の行セットに直接変換します。

OLE DB の行セットがクエリ プロセッサによってインポート先テーブルに挿入されます。各操作はクエリ プロセッサによって計画および最適化されます。

パフォーマンスに関する注意点

大量のデータをインポートする場合は、パフォーマンスに関する注意点が重要になる場合もあります。一括インポート操作または一括エクスポート操作において、次の 1 つ以上の項目に対して処理方法を変更すると、パフォーマンスが向上する場合があります。

  • バッチ スイッチ

  • CHECK 制約の制約チェック

  • 一括トランザクションのログ方法 (通常は完全復旧モデルを使用するデータベースに関して)

  • エクスポートされたデータの並べ替え

  • データの並列インポート

  • テーブルのロック

  • トリガーの実行

詳細については、「一括インポートのパフォーマンスの最適化」を参照してください。

注意

一括エクスポート操作には特殊な最適化技法はありません。この操作では SELECT ステートメントを使用してエクスポート元のテーブルのデータを選択するだけです。