我有一个例程,可将链接的SQL Server中的数据捕获到本地表中:
Set db = CurrentDb()
db.QueryTimeout = 0
...
strSql = "INSERT INTO Item " & _
"SELECT dbo_Item.* " & _
"FROM dbo_Item " & _
"WHERE dbo_Item.MASTER_INVID = " & TempVars!my_InvID
db.Execute strSql
问题在于其中一些数据集可能非常大(> 500K条记录,大小约为750MB)。
由于潜在的长时间获取过程,以及他们的互联网连接存在间歇性,我对某些用户感到奇怪。
问题:是否有可能/可能将这项任务分解为几个部分?从dbo记录集中获取记录块,并将其插入/追加到本地表中。我可以通过查询选择约5万条记录吗?
我确实知道row_count(通过DCount查询),所以我可以计算块的数量,并向用户显示一些进度(10个块中的1个...)类型的消息。
注意:奇数-通常我的用户会看到一条错误消息,但是很多时候,当前的获取方法只会放弃而不会产生投诉,并将控制权返回给初始表单。我在自己的会议上见过自己。
答案 0 :(得分:0)
这是我的方法-利用自动递增的属性“ clientinputid” 1 /:
Dim db As Database
Dim intRecordQty As Long
Dim intMin As Long
Dim intMax As Long
Dim intChunk As Long
Dim intCount As Long
Dim intQty As Long
Dim strSql As String
Set db = CurrentDb()
'unrelated code snipped....
intRecordQty = DCount("[dbo_Item.InvID]", "dbo_Item", "[InvID] = " & TempVars!my_InvID)
intMin = DMin("clientinputid", "dbo_Item", "[InvID] = " & TempVars!my_InvID)
intMax = DMax("clientinputid", "dbo_Item", "[InvID] = " & TempVars!my_InvID)
Select Case intRecordQty
Case 0 To 10000
intChunk = (intMax - intMin) / 2
Case 10001 To 25000
intChunk = (intMax - intMin) / 4
Case 25001 To 100000
intChunk = (intMax - intMin) / 10
Case Is > 100001
intChunk = (intMax - intMin) / 100
End Select
intQty = intRecordQty / intChunk
intCount = intMin
Do While intCount < intMax
strSql = "INSERT INTO Item " & _
"SELECT dbo_Item.* " & _
"FROM dbo_Item " & _
"WHERE dbo_Item.clientinputid between " & intCount & " and " & (intCount + intChunk) & " and dbo_Item.MASTER_INVID = " & TempVars!my_InvID
db.Execute strSql
DoEvents
intCount = intCount + intChunk + 1
Loop
'more unrelated code snipped....
1 /-clientinputid由机器生成为自动增量字段。上游过程会引入值范围内的漏洞。似乎可行,尽管我不知道每个InvID是否始终为真。