Share via


控制大量匯入作業的條件約束檢查

大量匯入資料時,您可以控制大量匯入作業是否要強制實施 CHECK 條件約束。「條件約束」是一種商務規則,它會施加在資料行上以定義其有效值,例如,包含電話分機之資料行的條件約束可能需要 #### 的格式。定義和檢查條件約束是強制資料完整性的標準機制。Microsoft 建議您在累加大量匯入時,都能使用條件約束檢查。

您有時可能想要忽略條件約束。如果您輸入的資料包含會違反條件約束的資料行,即為一例。若要忽略條件約束,您可以先載入資料,再使用 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...)

檢查條件約束

每個大量匯入命令都提供限定詞 (qualifier),讓您變更條件約束的處理方式 (請參閱下列部分的說明)。

以 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)>。