2013-12-08 41 views
1

我使用下面的VBA Access 2010中的一组进口记录从一个临时表(tblImport)添加到现有的链接表(tblPerson):有没有办法将查询的结果切分成可报告的块?

Dim dbs As Database   
Set dbs = CurrentDb 
dim StrSQl as String 
strSQL = strSQL & "INSERT INTO tblPerson (GenID, Surname, GivenNames, OtherInfo, GroupID) " 
strSQL = strSQL & "SELECT FHID, Surname, GivenNames, OtherInfo, Group FROM tblImport;" 
dbs.Execute strSQL 

对于大型数据集(绝对750000项纪录但可能小于该阈值 - 要确定的阈值) - 我想为导入提供进度指示器,以便用户不会失去希望并进入终端拒绝状态(或终止应用程序,因为它们可以没有看到任何进展。)导入这样的大文件应该是不经常的,导入时间和进度报告之间的权衡应该是可以接受的。

我正在考虑的一个选择是将数据集分成(比如说)10,000个记录块,并在每个记录块之后更新进度。

要做到这一点,我可以使用:

SELECT TOP 10000 FHID, Surname, GivenNames, OtherInfo, Group FROM tblImport ORDER BY FHID; 

其次

DELETE FROM tblImport 
WHERE FHID IN 
SELECT TOP 10000 FHID, Surname, GivenNames, OtherInfo, Group FROM tblImport ORDER BY FHID; 

确定数据要导入每次然后将其删除(在这一点我想报告进度)并迭代,直到tblImport中没有任何记录。

有没有更简单的方法来做到这一点?

+0

'tblImport.FHID'是数字主键吗? – HansUp

+0

@HansUp不,它是我无法控制的50个字符的文本字段。 – ColeValleyGirl

+0

你可以添加一个自动编号字段到'tblImport'临时表吗? – HansUp

回答

2

添加一个自动编号字段,pkey,作为tblImport临时表的主键。然后,您可以一次打开tblImport作为记录集和rs.Move 10000行,以获取每个组块边界的pkey值。使用WHERE子句中的边界值为每个块执行INSERT

在1100万行的表中,每次移动10K行花了不到10秒,所以对于你的750K行表,我估计性能的影响是可以忍受的。

相关问题