MSAccess-选择并插入到块中?

时间:2018-09-25 20:56:01

标签: ms-access

我有一个例程,可将链接的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个...)类型的消息。

注意:奇数-通常我的用户会看到一条错误消息,但是很多时候,当前的获取方法只会放弃而不会产生投诉,并将控制权返回给初始表单。我在自己的会议上见过自己。

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是否始终为真。