SQL Server Native Client での一括コピー操作の実行

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) は同梱されていません。

  • SQL Server 2022 (16.x) 以降のバージョン
  • SQL Server Management Studio 19 以降のバージョン

SQL Server Native Client (SQLNCLI または SQLNCLI11) と従来の Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。

新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。

SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、この「サポート ライフサイクルの例外」を参照してください。

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) はバイナリ データとしてバインドする必要があります。 フォーマット ファイルで、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

SQL Server Native Client OLE DB プロバイダーの一括コピー行セットの動作SSPROP_FASTLOADOPTIONS、SSPROP_FASTLOADKEEPNULLS、およびSSPROP_FASTLOADKEEPIDENTITYコントロールのプロバイダー固有のプロパティ。 プロパティは、rgPropertySetsIOpenRowsetparameter メンバーの 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 では、トリガーに対して行のバージョン管理が使用され、行のバージョンが 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)」を参照してください。

参照

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