通过大容量导入操作控制约束检查

大容量导入数据时,您可以控制大容量导入操作是否强制实施 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)