数据生成问题疑难解答

您在处理数据生成计划时可能会遇到以下问题:

  • 违反 CHECK 约束时数据生成失败

  • 无法将正则表达式数据生成器指派给用户定义的类型列

  • 无法为带有删除触发器的表生成数据

  • 与数据绑定生成器有关的问题

  • 无法为 SPARSE 列生成数据

违反 CHECK 约束时数据生成失败

为具有 CHECK 约束的列生成数据时,如果生成的数据违反该约束,则操作将失败。 运行计划前,可以使用**“数据生成预览”**窗口查看数据是否违反约束。 有关更多信息,请参见如何:预览数据生成计划

若要解决此问题,必须使用以下方法之一:

  • 使用MinMax 属性控制数据的生成方式。 例如,假设有一个表(该表具有名称分别为 StartDate 和 EndDate 的两列)和一个 CHECK 约束(要求 StartDate 在 EndDate 之前)。 您可以将 StartDate 列的 Max 属性设置为小于 EndDate 列的 Min 属性的值以实现目标。 有关更多信息,请参见指定为列生成数据的详细信息

  • 使用数据绑定生成器。 有关更多信息,请参见数据绑定生成器

  • 使用自定义数据生成器。 有关更多信息,请参见用自定义数据生成器生成专用的测试数据

无法将正则表达式数据生成器指派给具有唯一约束的用户定义的类型列

当您尝试将数据生成器指派给具有唯一约束的列时,可用生成器的列表只显示可以生成唯一值的生成器。 由于正则表达式生成器无法保证生成唯一值,因此您不能使用它来填充具有唯一约束的用户定义的类型列。

若要为具有唯一约束的用户定义的类型列生成数据,必须使用数据绑定生成器或自定义数据生成器。 有关更多信息,请参见数据绑定生成器用自定义数据生成器生成专用的测试数据

无法为带有删除触发器的表生成数据

某些表中的触发器会禁止您删除这些表中的行。 如果您尝试删除此类表中的行,则触发器将回滚删除操作。 通常不能为此类表或引用此类表的表生成数据。 例如,通常不能为 AdventureWorks 数据库中的 Employee 表生成数据。

若要为此类表生成数据,请使用以下方法之一:

  • 禁用或删除触发器,运行数据生成计划以及重新启用或重新添加触发器。

  • 运行数据生成计划。 如果系统询问您是否在插入新行之前清除表中的内容,请单击**“否”**。 生成的新数据将添加到表中的任何现有数据中,以便删除触发器不会发生。 此方法会导致不可预知的结果,如果其中任何一列具有唯一约束,则还可能会出现错误。

与数据绑定生成器有关的问题

如果已为其指定数据绑定生成器的一列或多列未能生成数据,则**“列详细信息”**窗口中的“生成器输出”列将显示“无输出”或“无强制输出”。 以下部分将说明此类数据生成失败的原因。

无输出

如果“生成器输出”列显示“无输出”,则在 Select Query 属性中指定的 SELECT 语句可能不正确。 由于在**“属性”**窗口中很难看到 SELECT 语句,因此可能要将此语句复制并粘贴到 Transact-SQL 编辑器中来验证此语句是否正确。

无强制输出

如果“生成器输出”列显示“无强制输出”,则是因为无法将 SELECT 语句返回的数据类型强制转换为要生成数据的列的数据类型。 例如,如果要为类型为 INT 的列生成数据,则以下 SELECT 语句将导致显示“无强制输出”:

SELECT RAND() * (column1 - column2) AS Column1 FROM Table1

您必须更新 SELECT 语句以返回可以强制转换为 INT 的数据,如下所示:

SELECT CAST(RAND() * (column1 - column2) AS INT) AS Column1 FROM Table1

无法为 SPARSE 列生成数据

如果尝试为包含一个或多个 SPARSE 列和一个 COLUMN_SET 的表生成数据,可能会出现以下错误:“由于以下异常,数据生成失败: 给定的 ColumnMapping 与源或目标中的任意列均不匹配”。

例如,如果尝试为以下表生成数据,则可能会出现上述错误:

CREATE TABLE [dbo].[SparseTable]
(
ID INT PRIMARY KEY,
C1 varchar(20) SPARSE NULL, 
C2 smallint SPARSE NULL,
C3 varchar(20) SPARSE NULL,
SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
)

若要为包含 SPARSE 列和 COLUMN_SET 的表生成数据,必须将数据插入的首选方法更改为“SqlV1CompatibilitySink”,或者必须使用自定义数据生成器。

如果使用“SqlV1CompatibilitySink”,要为大型表生成数据可能会很慢。

有关如何更改数据插入的首选方法的更多信息,请参见如何:为数据生成器指定默认值和选项。 有关如何创建和部署自定义数据生成器的更多信息,请参见用自定义数据生成器生成专用的测试数据