Share via


一括コピー操作の実行

SQL Server の一括コピー機能により、SQL Server テーブルやビューに大量のデータを入出力できます。SELECT ステートメントを指定してデータを外部に転送することもできます。SQL Server と ASCII ファイルなどのオペレーティング システム データ ファイルとの間でデータを移動できます。データ ファイルには、さまざまな形式を使用できます。一括コピーの形式は、フォーマット ファイルで定義されます。必要に応じて、データをプログラム変数に読み込んでから、一括コピー関数や一括コピー メソッドを使用して SQL Server に転送できます。

アプリケーションでは、通常、次のいずれかの方法で一括コピーを使用します。

  • テーブル、ビュー、または Transact-SQL ステートメントの結果セットからデータ ファイルに一括コピーします。その際、コピー先のデータ ファイルには、テーブルやビューと同じ形式でデータを格納します。
    これをネイティブモード データ ファイルと呼びます。
  • テーブル、ビュー、または Transact-SQL ステートメントの結果セットからデータ ファイルに一括コピーします。その際、コピー先のデータ ファイルには、テーブルやビューとは異なる形式でデータを格納します。
    この場合、データ ファイルに格納される各列の特性 (データ型、位置、長さ、ターミネータなど) を定義するフォーマット ファイルを別に作成します。すべての列を文字形式に変換する場合、変換後のファイルをキャラクタモード データ ファイルと呼びます。
  • データ ファイルからテーブルやビューに一括コピーします。
    必要に応じて、フォーマット ファイルを使用してデータ ファイルのレイアウトを決定します。
  • プログラム変数にデータを読み込んでから、毎回 1 行ずつ一括コピーを行う一括コピー関数を使用して、データをテーブルやビューにインポートします。

一括コピー関数で使用するデータ ファイルを、別の一括コピー プログラムで作成する必要はありません。他のシステムでも、一括コピー定義に従ってデータ ファイルとフォーマット ファイルを作成できます。その後、これらのファイルを SQL Server の一括コピー プログラムで使用して、データを SQL Server にインポートできます。たとえば、スプレッドシートからタブ区切り形式のファイルにデータをエクスポートし、タブ区切りファイルの形式を示すフォーマット ファイルを作成した後、一括コピー プログラムを使用して、データを SQL Server に簡単にインポートできます。一括コピーで生成されたデータ ファイルを、他のアプリケーションにインポートすることもできます。たとえば、一括コピー関数を使用して、スプレッドシートに読み込むことができるタブ区切りファイルとして、テーブルやビューからデータをエクスポートできます。

ms130809.note(ja-jp,SQL.90).gifメモ :
SQL Server 2005 で bcp ユーティリティを使用する場合は、数値データの切り捨てが発生した場合、サーバーからエラーが報告されます。SQL Server 2000 以前のリリースでは、警告が返されるだけでした。この動作変更により、この警告を無視していた既存のアプリケーションで問題が発生することがあります。このような問題を回避するには、入力データの値が切り捨てが発生しない適切な値であることを確認するか、SQL Server 2000 の bcp を引き続き使用してください。

一括コピー関数を使用するアプリケーションをコーディングするプログラマは、適切なパフォーマンスで一括コピーを行うための一般的な規則に従う必要があります。SQL Server での一括コピー操作サポートの詳細については、「一括インポート操作と一括エクスポート操作について」を参照してください。

SQL Native Client OLE DB プロバイダ

SQL Native Client OLE DB プロバイダには、SQL Server データベースで一括コピー操作を実行するための 2 つのメソッドが実装されています。1 つ目のメソッドでは、メモリベースの一括コピー操作に IRowsetFastLoad インターフェイスを使用します。2 つ目のメソッドでは、ファイルベースの一括コピー操作に IBCPSession インターフェイスを使用します。

メモリ ベースの一括コピー操作の使用

SQL Native Client OLE DB プロバイダでは、IRowsetFastLoad インターフェイスが実装され、SQL Server のメモリベースの一括コピー操作がサポートされます。IRowsetFastLoad インターフェイスには、IRowsetFastLoad::Commit メソッドと IRowsetFastLoad::InsertRow メソッドが実装されています。

IRowsetFastLoad のセッションの有効化

コンシューマは、SQL Native Client OLE DB プロバイダ固有のデータ ソース プロパティである SSPROP_ENABLEFASTLOAD を VARIANT_TRUE に設定することにより、一括コピーを実行する必要があることを SQL Native Client OLE DB プロバイダに通知します。コンシューマはデータ ソースのプロパティ セットを使用して、SQL Native Client OLE DB プロバイダ セッションを作成します。この新しいセッションによって、コンシューマから IRowsetFastLoad インターフェイスにアクセスできるようになります。

ms130809.note(ja-jp,SQL.90).gifメモ :
データ ソースの初期化に IDataInitialize インターフェイスを使用する場合は、IOpenRowset::OpenRowset メソッドの rgPropertySets パラメータで SSPROP_IRowsetFastLoad プロパティを設定する必要があります。このプロパティを設定せずに OpenRowset メソッドを呼び出すと、E_NOINTERFACE が返されます。

一括コピー用にセッションを有効にすることで、そのセッションのインターフェイスに対する SQL Native Client OLE DB プロバイダのサポートが制限されます。一括コピーが可能なセッションは、次のインターフェイスのみを公開します。

  • IDBSchemaRowset
  • IGetDataSource
  • IOpenRowset
  • ISupportErrorInfo
  • ITransactionJoin

一括コピー可能な行セットの作成を無効にし、SQL Native Client OLE DB プロバイダ セッションの処理を標準処理に戻すには、SSPROP_ENABLEFASTLOAD を VARIANT_FALSE にリセットします。

IRowsetFastLoad 行セット

SQL Native Client OLE DB プロバイダの一括コピー行セットは書き込み専用ですが、コンシューマはこれらの行セットが公開するインターフェイスを使用することで、SQL Server テーブルの構造を決定できます。一括コピー可能な SQL Native Client OLE DB プロバイダ行セットは、次のインターフェイスを公開します。

  • IAccessor
  • IColumnsInfo
  • IColumnsRowset
  • IConvertType
  • IRowsetFastLoad
  • IRowsetInfo
  • ISupportErrorInfo

プロバイダ固有のプロパティ SSPROP_FASTLOADOPTIONS、SSPROP_FASTLOADKEEPNULLS、および SSPROP_FASTLOADKEEPIDENTITY により、SQL Native Client OLE DB プロバイダの一括コピー行セットの動作が制御されます。これらのプロパティは、rgPropertySetsIOpenRowset パラメータ メンバの rgProperties メンバで指定されます。

プロパティ ID 説明

SSPROP_FASTLOADKEEPIDENTITY

列 : なし

R/W: 読み取り/書き込み

型 : VT_BOOL

既定値 : VARIANT_FALSE

説明 : コンシューマが指定する ID 値を管理します。

VARIANT_FALSE: SQL Server テーブルの ID 列の値が SQL Server によって生成されます。SQL Native Client OLE DB プロバイダでは、列にバインドされた値は無視されます。

VARIANT_TRUE: コンシューマが、SQL Server ID 列に値を提供するアクセサをバインドします。NULL を許容する列では ID プロパティを使用できないので、コンシューマは IRowsetFastLoad::Insert を呼び出すたびに一意な値を指定します。

SSPROP_FASTLOADKEEPNULLS

列 : なし

R/W: 読み取り/書き込み

型 : VT_BOOL

既定値 : VARIANT_FALSE

説明 : DEFAULT 制約が適用されている列の NULL 値を管理します。影響を受けるのは、NULL 値を許容し、DEFAULT 制約が適用されている SQL Server 列だけです。

VARIANT_FALSE: SQL Native Client OLE DB プロバイダのコンシューマが列に NULL 値を含む行を挿入すると、SQL Server ではその列に既定値が挿入されます。

VARIANT_TRUE: SQL Native Client OLE DB プロバイダのコンシューマが列に NULL 値を含む行を挿入すると、SQL Server ではその列に NULL 値が挿入されます。

SSPROP_FASTLOADOPTIONS

列 : なし

R/W: 読み取り/書き込み

型 : VT_BSTR

既定値 : なし

説明 : このプロパティは、bcp ユーティリティの -h "hint[,...n]" オプションと同じです。データをテーブルに一括コピーするときのオプションとして、次の文字列を使用できます。

ORDER(column[ASC | DESC][,...n]): データ ファイル内のデータの並べ替え順です。読み込むデータ ファイルをテーブル上のクラスタ化インデックスに従って並べ替えると、一括コピーのパフォーマンスが向上します。

ROWS_PER_BATCH = bb: バッチあたりのデータの行数です (bb)。サーバーは、bb の値に応じて一括コピーの負荷を最適化します。ROWS_PER_BATCH の既定値はありません。

KILOBYTES_PER_BATCH = cc: バッチごとのデータの KB (キロバイト数) です (cc)。KILOBYTES_PER_BATCH の既定値はありません。

TABLOCK: 一括コピー操作時にテーブルレベルのロックを行います。一括コピー操作中だけロックを保持することにより、テーブル ロックの競合が少なくなるので、このオプションによりパフォーマンスが大幅に向上します。テーブルにインデックスがなく、TABLOCK が指定されている場合は、複数のクライアントが同時に 1 つのテーブルを読み込むことができます。既定では、ロック動作はテーブル オプション table lock on bulk load によって決定されます。

CHECK_CONSTRAINTS: 一括コピー操作中、table_name に適用されているすべての制約がチェックされます。既定では、制約は無視されます。

FIRE_TRIGGER: SQL Server 2000 では、トリガが有効になっていると、ログ記録を最適化できませんでした。これは、トリガのロジックがログ レコードに基づいていたためです。これにより、トリガを有効にして一括インポート操作を実行している間は、すべての一括ログ記録の最適化 (BU ロックを含む) が無効になっていました。

ただし、SQL Server 2005 ではトリガに対して行のバージョン管理が使用され、行のバージョンが tempdb 内のバージョン ストアに格納されます。したがって、トリガが有効になっていても一括ログ記録を最適化できます。トリガを有効にして大量の行が含まれるバッチを一括インポートする前に、tempdb のサイズの拡張が必要になる場合があります。

ファイル ベースの一括コピー操作の使用

SQL Native Client OLE DB プロバイダでは、IBCPSession インターフェイスが実装され、SQL Server のファイルベースの一括コピー操作がサポートされます。IBCPSession インターフェイスには、IBCPSession::BCPColFmtIBCPSession::BCPColumnsIBCPSession::BCPControlIBCPSession::BCPDoneIBCPSession::BCPExecIBCPSession::BCPInitIBCPSession::BCPReadFmt、および IBCPSession::BCPWriteFmt の各メソッドが実装されます。

SQL Native Client ODBC ドライバ

SQL Native Client ODBC ドライバでは、以前のバージョンの SQL Server ODBC ドライバの一部であった一括コピー操作サポートが同様に提供されます。SQL Native Client ODBC ドライバを使用した一括コピー操作の詳細については、「一括コピー操作の実行 (ODBC)」を参照してください。

参照

概念

データ ソースのプロパティ (OLE DB)

その他の技術情報

SQL Native Client の機能
一括インポート操作と一括エクスポート操作について
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手