2008-12-02 33 views
2

我有一张7M记录的表,我想修剪为10K的开发。我尝试了删除,但整个世界几乎被事务日志大小所压倒,所以我截断了表。如何限制在SSIS包中处理的记录数量?

现在我想从原始表中插入10k条记录到我的开发表中,但它有一个标识列和许多其他列,所以我想我会尝试SSIS(通过向导) ,它很好地处理了身份,但却没有给我编辑查询的地方。所以我很快用top子句做了一个视图,并将源的RowSet属性更改为视图。现在一切都失败了,因为没有看到视图,尽管我从创建视图语句复制并粘贴了视图名称,但是第二次失败了,因为视图确实存在。

SSIS是否定义创建包时使用哪些数据库对象,这会排除新视图,如果是这样,我该如何刷新它?

+0

700万条记录是否代表交易?如果是这样,那么确定1000个左右的最近客户是有意义的,然后仅从每个表中获取他们的交易。如果你使用随机记录,那么你只能得到旧的风格记录和不完整的客户。 – 2009-01-03 17:34:33

回答

1

真的没有必要使用SSIS来做到这一点。您应该能够使用SQL插入记录。首先,您需要将IDENTITY_INSERT设置为打开。然后,你应该能够执行这样的事情:

SET IDENTITY_INSERT db.schema.dev_table ON

INSERT INTO dev_table SELECT TOP(10000)* FROM prod_table

+0

我的问题在这里列出所有的字段。我可能已经找到了一种脚本编写方法,但急于开始,并认为SSIS会提供一个很好,快捷,方便的方法。 – ProfK 2009-03-01 21:03:06

0

您是否尝试关闭并重新打开包装?我不希望你必须这样做。我的第一个想法是它是一个安全问题 - 你没有给自己选择。

+0

我回到了向导(第四个过程),并使用查询重新选择top 10k,而不是仅仅复制表格。我仍然必须检查第二个包与第一个包的区别。 – ProfK 2008-12-02 22:28:40

0

您是否使用视图的完全限定名称? Doe坐拥有与默认所有者不同的所有者吗?打开数据源并对数据进行预览以确保它们全部连接起来。

1

埃德是正确的,SSIS是矫枉过正对于这项任务 - 特别是因为你只插入10K记录。

假设DEV表格的模式与生产相同,所显示的脚本Ed将工作得很好。

如果架构不同,您可以专门指定列 - 包括标识列(记住将标识插入后设置为OFF)。例如:

SET IDENTITY_INSERT dbo.dev_table ON 
INSERT INTO dev_table (Id, Col1,Col2,Col3,Col4) 
SELECT TOP 10000 Id, Col1, Col2, Col3, Col4 FROM prod_table 
SET IDENTITY_INSERT dbo.dev_table OFF 
+0

这个解决方案似乎假定Dev和Prod要么在同一台服务器上,要么在Dev和Prod之间已经建立了链接服务器,要么在Prod上创建了一个临时数据库,这个数据库将被填充并移动到Dev或Prod副本已经恢复到Dev。如果第四个是真的,那么这个解决方案是很好 – 2009-01-03 17:30:49

1

您也可以使用行采样控制从整体数据中提取随机数的记录,而不是仅获取最前面的10000行。这样可以为开发/测试提供更好的样本,因为您不会仅针对您最老的10000个(如果您的分布与我见过的大多数表格一样)记录开发,而是从整个文件中抽取样本。

相关问题