Обработка сотен тысяч SQL строк сервера в VBA - PullRequest
1 голос
/ 28 февраля 2020

У меня есть несколько SQL серверных таблиц, одна из которых содержит 200 000 строк, а другая 900 000 строк, каждая из которых может содержать 50 столбцов. Мне нужно загрузить их в CSV-файл и в сценарии VBA (это внутри Excel). Все строки и все столбцы должны быть экспортированы.

Предположим, у вас есть набор записей oRe c, взятый из простого запроса. Все столбцы являются varchars, большинство из них varchar (20) или varchar (200)

'SELECT * FROM TABLE'.

В приведенном ниже коде I l oop через набор записей, а затем через каждый столбец. Если я закомментирую цикл столбцов или просто получу первый столбец, это будет довольно быстро. Но каждый столбец экспоненциально усложняет прием более часа.

Есть ли лучший способ? Мне нужны все строки и столбцы, и 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
...