我正在使用2张桌子:
首先作为保存数据的主表
第二个是每天导入新报告的临时表,并检查新报告和主表中记录之间的差异。
tablename="Temp"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel10, tablename,strPath, True, "A:CH"
stringSQL =
UPDATE
Main INNER JOIN Temp ON Main.[PackageNumber] = Temp.[PackageNumber]
SET
Main.[Field1]=Temp.[Field1],
Main.[Field2]=Temp.[Field2] ...
如果在临时表中我可以找到已经存在的包号的记录,我必须使用临时表中的数据更新主表中的整行。 主表中大约有30列,每天都有几千条记录要检查临时报告。
目前我遇到性能问题,导致整个操作可能需要超过一小时! 有什么可能让它跑得更快? 我已经尝试过“修复和压缩数据库”功能。
答案 0 :(得分:0)
您需要在导入的表的JOIN列上创建索引。我认为它是主键。
运行DoCmd.TransferSpreadsheet
后,请执行以下操作:
CurrentDb.Execute "CREATE UNIQUE INDEX PrimaryKey ON Temp (PackageNumber) WITH PRIMARY"
您的Main
表应该已将PackageNumber作为主键。
答案 1 :(得分:0)
您可以直接查询Excel文件,避免创建临时表以及与之相关的任何开销:
window.setTimeout(runScripts, 500);
这比UPDATE
Main INNER JOIN [Excel 10.0;HDR=Yes;DATABASE=C:\YourFile.xls].[A:CH] Temp ON Main.[PackageNumber] = Temp.[PackageNumber]
SET
Main.[Field1]=Temp.[Field1],
Main.[Field2]=Temp.[Field2] ...
的工作方式更快,在我看来应该尽可能避免。