通過大容量匯入操作控制約束檢查

iSQlServer發表於2008-11-26

大容量匯入資料時,您可以控制大容量匯入操作是否強制實施 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...)
 檢查約束
 

每個大容量匯入命令都提供了限定符,使您可以更改約束的處理方式,如以下各節所述。

 使用 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)。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-503401/,如需轉載,請註明出處,否則將追究法律責任。

相關文章