次の方法で共有


一括コピー操作の実行

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

この機能を示すサンプル アプリケーションについては、「 IRowsetFastLoad (OLE DB) を使用したデータの一括コピー」を参照してください。

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

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

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

  • Transact-SQL ステートメントのテーブル、ビュー、または結果セットから、データがテーブルまたはビュー以外の形式で格納されているデータ ファイルに一括コピーします。

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

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

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

  • プログラム変数にデータを読み込み、一括コピー関数を使用して一括コピー関数を使用して一度に 1 行にデータをインポートします。

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

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

制限事項と制約条件

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

一括コピー操作では SET FMTONLY OFF を使用しないでください。 SET FMTONLY OFF を指定すると、一括コピー操作が失敗したり、予期しない結果が発生したりする可能性があります。

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

SQL Server Native Client OLE DB プロバイダーは、SQL Server データベースで一括コピー操作を実行するための 2 つの方法を実装しています。 最初のメソッドでは、メモリベースの一括コピー操作に 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

SQL Server Native Client OLE DB プロバイダーの一括コピー行セットの動作SSPROP_FASTLOADOPTIONS、SSPROP_FASTLOADKEEPNULLS、およびSSPROP_FASTLOADKEEPIDENTITYコントロールのプロバイダー固有のプロパティ。 プロパティは、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 列の値を提供するアクセサーをバインドします。 ID プロパティは NULL を受け入れる列では使用できないため、コンシューマーは 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

既定値: なし

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

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 が指定されている場合は、複数のクライアントが同時にテーブルを読み込むことができます。 既定では、ロック動作は、 一括読み込み時のテーブル オプション テーブル ロックによって決まります。

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

FIRE_TRIGGER: SQL Server はトリガーに行のバージョン管理を使用し、 tempdb のバージョン ストアに行バージョンを格納します。 そのため、トリガーが有効になっている場合でも、一括ログの最適化を使用できます。 トリガーが有効になっている多数の行を含むバッチを一括インポートする前に、 tempdb のサイズを拡張することが必要になる場合があります。

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

SQL Server Native Client OLE DB プロバイダーは 、IBCPSession インターフェイスを実装して、SQL Server ファイル ベースの一括コピー操作のサポートを公開します。 IBCPSession インターフェイスでは、IBCPSession::BCPColFmtIBCPSession::BCPColumnsIBCPSession::BCPControlIBCPSession::BCPDoneIBCPSession::BCPExecIBCPSession::BCPInitIBCPSession::BCPReadFmtIBCPSession::BCPWriteFmtメソッド。

SQL Server Native Client ODBC ドライバー

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

こちらもご覧ください

SQL Server Native Client の機能
データ ソースのプロパティ (OLE DB)
データの一括インポートと一括エクスポート (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
一括インポートのパフォーマンスの最適化