数据生成问题疑难解答
更新:2007 年 11 月
您在处理数据生成计划时可能会遇到以下问题:
无法打开数据生成计划
违反 CHECK 约束时数据生成失败
无法将正则表达式数据生成器指派给用户定义的类型列
无法为带有删除触发器的表生成数据
与数据绑定生成器有关的问题
无法打开数据生成计划
如果找不到指派给现有数据生成计划中某列的数据生成器,您将无法打开该计划,并且会出现以下错误消息:
加载 文件名.dgen 失败。无法找到类型为 生成器名称 的可用生成器。请通过手动编辑此 dgen 文件然后重新加载它来修复此错误。
下面是此错误的一些可能的原因和解决方法:
数据生成器的类名称已更改。如果只有名称发生了更改,您可以在文本编辑器中打开 .dgen 文件,然后手动更改 XML。必须将受影响的列的数据生成器的名称更改为新名称。
数据生成器已被否决。可以在文本编辑器中打开 .dgen 文件,然后手动更改 XML。在这种情况下,对于所有受影响的列,应从 XML 中移除整个 <ColumnConfig> 元素(和所有子元素)。在 Visual Studio 中打开数据生成计划并接受架构更改。默认数据生成器被指派给受影响的列。您还必须重新选择受影响的列以便将它们包括在数据生成计划中。有关更多信息,请参见如何:为数据生成指定列。
与数据生成器对应的项被从 extensions.xml 文件中移除。您必须更改 extensions.xml 文件并为数据生成器添加 <extensions> 元素。必须关闭 Visual Studio 然后重新打开它才能使更改生效。
.dll 文件和 extensions.xml 文件不同步。.dll 文件中不存在 extensions.xml 文件中定义的数据生成器。必须重新部署程序集和 Extensions.xml 文件的正确版本才能解决此问题。必须关闭再重新打开 Visual Studio 以使更改生效。
违反 CHECK 约束时数据生成失败
为具有 CHECK 约束的列生成数据时,如果生成的数据违反该约束,则操作将失败。运行计划前,可以使用“数据生成预览”窗口查看数据是否违反约束。有关更多信息,请参见如何:预览数据生成计划。
若要解决此问题,必须使用以下方法之一:
使用 Min 和 Max 属性控制数据的生成方式。例如,假设有一个表(该表具有名称分别为 StartDate 和 EndDate 的两列)和一个 CHECK 约束(要求 StartDate 在 EndDate 之前)。您可以将 StartDate 列的 Max 属性设置为小于 EndDate 列的 Min 属性的值以实现目标。有关更多信息,请参见为列指定数据生成的详细信息。
使用数据绑定生成器。有关更多信息,请参见数据绑定生成器。
使用自定义数据生成器。有关更多信息,请参见创建自定义数据生成器。
无法将正则表达式数据生成器指派给具有唯一约束的用户定义的类型列
当您试图将数据生成器指派给具有唯一约束的列时,可用生成器的列表只显示可以生成唯一值的生成器。由于正则表达式生成器无法保证生成唯一值,因此您不能使用它来填充具有唯一约束的用户定义的类型列。若要为具有唯一约束的用户定义的类型列生成数据,必须使用数据绑定生成器或自定义数据生成器。有关更多信息,请参见数据绑定生成器和创建自定义数据生成器。
无法为带有删除触发器的表生成数据
某些表中的触发器会禁止您删除这些表中的行。如果您试图删除此类表中的行,则触发器将回滚删除操作。通常不能为此类表或引用此类表的表生成数据。例如,通常不能为 AdventureWorks 数据库中的 Employee 表生成数据。
若要为此类表生成数据,请使用以下方法之一:
删除触发器、运行数据生成计划以及重新添加触发器。
运行数据生成计划。如果系统询问您是否在插入新行之前清除表中的内容,请单击“否”。生成的新数据将添加到表中的任何现有数据中,以便删除触发器不会发生。此方法会导致不可预知的结果,如果其中任何一列具有唯一约束,则还可能会出现错误。
与数据绑定生成器有关的问题
如果已为其指定数据绑定生成器的一列或多列未能生成数据,则“列详细信息”窗口中的“生成器输出”列将显示“无输出”或“无强制输出”。以下部分将说明此类数据生成失败的原因。
无输出
如果“生成器输出”列显示“无输出”,则在 Select Query 属性中指定的 SELECT 语句可能不正确。由于在“属性”窗口中很难看到 SELECT 语句,因而可能要将此语句复制并粘贴到 Transact-SQL (T-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
有关 SELECT 和其他 T-SQL 语句的更多信息,请参见 Microsoft 网站上的“Transact-SQL 引用(数据库引擎)”。