一括コピー操作の実行

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

CodePlex には、この機能を示すサンプル アプリケーションがあります。詳細については、「SQL Server データベース エンジン サンプル」を参照してください。アプリケーションでは、通常、次のいずれかの方法で一括コピーを使用します。

  • テーブル、ビュー、または Transact-SQL ステートメントの結果セットからデータ ファイルに一括コピーします。その際、コピー先のデータ ファイルには、テーブルやビューと同じ形式でデータを格納します。

    これをネイティブモード データ ファイルと呼びます。

  • テーブル、ビュー、または Transact-SQL ステートメントの結果セットからデータ ファイルに一括コピーします。その際、コピー先のデータ ファイルには、テーブルやビューとは異なる形式でデータを格納します。

    この場合、データ ファイルに格納される各列の特性 (データ型、位置、長さ、ターミネータなど) を定義するフォーマット ファイルを別に作成します。すべての列を文字形式に変換する場合、変換後のファイルをキャラクターモード データ ファイルと呼びます。

  • データ ファイルからテーブルやビューに一括コピーします。

    必要に応じて、フォーマット ファイルを使用してデータ ファイルのレイアウトを決定します。

  • プログラム変数にデータを読み込んでから、毎回 1 行ずつ一括コピーを行う一括コピー関数を使用して、データをテーブルやビューにインポートします。

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

注意

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

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

制限事項と制約事項

CLR ユーザー定義型 (UDT) はバイナリ データとしてバインドする必要があります。フォーマット ファイルで、SQLCHAR がコピー先の UDT 列のデータ型として指定されていたとしても、BCP ユーティリティは、そのデータをバイナリとして扱います。

一括コピー操作では SET FMTONLY OFF を使用しないでください。SET FMTONLY OFF を使用すると、一括コピー操作でエラーや予期しない結果が生じることがあります。

SQL Server Native Client OLE DB プロバイダー

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

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

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

IRowsetFastLoad のセッションの有効化

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

注意

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

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

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

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

IRowsetFastLoad 行セット

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

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

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

プロパティ ID

説明

SSPROP_FASTLOADKEEPIDENTITY

列 : なし

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

型 : VT_BOOL

既定値 : VARIANT_FALSE

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

VARIANT_FALSE: SQL Server テーブルの ID 列の値が SQL Server によって生成されます。SQL Server 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 Server Native Client OLE DB プロバイダーのコンシューマーが列に NULL 値を含む行を挿入すると、SQL Server ではその列に既定値が挿入されます。

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

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

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

SQL Server Native Client ODBC ドライバー

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