一括インポート操作による制約チェックの制御

データを一括インポートするときは、一括インポート操作によって CHECK 制約を適用するかどうかを制御できます。制約とは、列の有効な値を定義するために列に適用されるビジネス ルールのことです。たとえば、電話の内線番号を含んでいる列の制約には、#### という形式が必要となる場合があります。制約の定義とチェックは、データの整合性を設定するための標準的なメカニズムです。通常、制約チェックは増分一括インポートの際に使用してください。

制約を無視することが必要な場合があります。たとえば、制約に違反する行が入力データに含まれている場合などです。制約を無視することによって、データを読み込んだ後に、Transact-SQL のステートメントを使用してデータをクリーンアップできます。

注意

一括インポート操作中に制約を無視すると、既存の制約に違反するデータをテーブルに挿入できます。そのため、テーブルの制約は、sys.check_constraints カタログ ビューで is_not_trusted に設定されています (詳細については、「sys.check_constraints (Transact-SQL)」を参照してください)。テーブル全体の制約は、任意の時点で必ず検証してください。

一括インポート操作の前にテーブルが空でなかった場合、制約を再検証するコストは、増分データに CHECK 制約を適用するコストを超える場合があります。問題のあるデータをインポートした後は、Transact-SQL を使用して、インポートしたデータをクリーンアップする必要があります。

重要な注意事項重要

制約が無効になっていると、メタデータを更新するためにスキーマ変更ロックが取得される場合があります。これにより、他のコマンド (オンラインのインデックス構築など) またはトランザクションとの競合が生じる可能性があります。たとえば、ターゲット テーブルにアクセスするスナップショット分離トランザクションは、DDL の同時変更が原因で失敗することがあります。

制約の詳細については、「制約」を参照してください。

一括インポート操作中の制約チェックの動作は、どのコマンドを操作に使用するかによって決まります。bcp コマンドと BULK INSERT ステートメントでは、制約は既定で無視されます。これに対して、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントでは、制約は既定でチェックされます。

次の表は、一括インポート コマンドの既定の制約チェック動作を示しています。

コマンド

既定の動作

bcp

制約を無視

BULK INSERT

制約を無視

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

制約をチェック

各一括インポート コマンドには、制約の処理方法を変更するための修飾子が用意されています。これについては、次のセクションで説明します。

bcp または BULK INSERT を使用した制約のチェック

bcp コマンドまたは BULK INSERT ステートメントによって実行される一括インポート操作では、制約は既定で無視されます。

bcp コマンドと BULK INSERT ステートメントを使用すると、一括インポート操作中に制約を適用するように指定することができます。制約を適用すると、一括インポート操作は遅くなりますが、挿入されたすべてのデータが確実に既存の制約に従うようになります。次の表は、一括インポート操作で制約の適用を指定するために使用できる修飾子を示しています。

コマンド

修飾子

修飾子の種類

bcp

-h"CHECK_CONSTRAINTS"

ヒント

BULK INSERT

CHECK_CONSTRAINTS

引数

詳細については、「bcp ユーティリティ」および「BULK INSERT (Transact-SQL)」を参照してください。

INSERT ... SELECT * FROM OPENROWSET(BULK...) における制約の無視

既定では、INSERT は CHECK 制約をチェックしますが、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントを使用すると、CHECK 制約のチェックをオーバーライドできます。これらの制約については、「CHECK 制約」を参照してください。

注意

CHECK 制約のみ無効にすることができます。UNIQUE、PRIMARY KEY、FOREIGN KEY、または NOT NULL の各制約を無効にすることはできません。

次の表は、CHECK 制約を無視するためのテーブル ヒントを示しています。

コマンド

修飾子

修飾子の種類

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

WITH (IGNORE_CONSTRAINTS)

テーブル ヒント

次の例は、この修飾子の使用方法を示しています。IGNORE_CONSTRAINTS ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。

データがインポートされたことの確認

一括インポート操作で制約を無視する場合は、インポートしたデータを手動でチェックすることにより、制約に違反しているインポートしたテーブル行を後から特定できます。データを手動でチェックするには、制約条件をテストする Transact-SQL クエリまたはストアド プロシージャを使用できます。

注意

テーブルが信頼できるかどうかを確認するには、sys.check_constraints カタログ ビューの is_not_trusted 列を参照します。詳細については、「sys.check_constraints (Transact-SQL)」を参照してください。