首页 > 解决方案 > 在 VBA 中处理数十万 SQL Server 行

问题描述

我有几个 SQL 服务器表,一个有 200,000 行,另一个有 900,000 行,两者都可能有 50 列。我需要将它们下载到 csv 文件中,并在 VBA 脚本中(它在 Excel 中)。需要导出所有行和所有列。

假设您有一个从简单查询中获取的记录集 oRec。所有列都是 varchars,大多数是 varchar(20) 或 varchar(200)

'SELECT * FROM TABLE'.

在下面的代码中,我循环遍历记录集,然后遍历每一列。如果我注释掉列循环或只获取第一列,它会非常快。但是每一列都以指数方式使花费一个多小时变得更糟。

有没有更好的办法?我需要每一行和每一列,而 VBA/Excel 是唯一的方法,因为它是 Excel 中处理数据的系统的一部分。这适用于最终用户,因此他们没有 sql 工具、库(只是办公室),我无法分发应用程序。此导出只是较大的 Excel 自动化项目的一小部分。

While Not oRec.EOF
    sLine = ""
    LineCount = LineCount + 1
        For Each col In oRec.Fields

            If IsNull(col.value) Then
                sVal = "NULL"
            Else
                sVal = col.value
            End If

            If Not bHaveHeader Then
                sHeader = sHeader & CStr(col.name) & ","
                sLine = sLine & "," & sVal
            Else
                sLine = sLine & "," & sVal
            End If
            colOffset = colOffset + 1
        Next
        colOffset = 0
        If bHaveHeader Then
            sLines = sLines & Right(sLine, Len(sLine) - 1) & vbCrLf
        Else
            If LineCount Mod EXPORT_LINE_BUFFER = 0 Then
                'lines ready to be exported. last line can't have carriage return
                sLines = sHeader & vbCrLf & sLines & Right(sLine, Len(sLine) - 1)
                Call UpdateFile(fs, sExportFile, sLines)
                sLines = ""
            Else
                sLines = sHeader & vbCrLf & sLines & Right(sLine, Len(sLine) - 1) & vbCrLf
            End If
        End If

        bHaveHeader = True

    oRec.MoveNext
Wend

标签: sql-servervbadaoadodb

解决方案


推荐阅读