sql-server - 在 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
解决方案
推荐阅读
- performance-testing - 如何在 Loadrunner VUGen 中获取整个响应体?
- java - 比较对象数组中某个特定字段的值以进行合并排序。关于使用 compareTo 的初学者问题
- c++ - 如何使用glfw居中opengl窗口?
- javascript - 如何在编辑 HTML 文件及其随附的 CSS 文件时让 nodemon 更新 Chrome 的 HTML 文件显示?
- python - 如何使用 selenium python 在 angularjs 中选择引用的下拉列表
- python - Python numpy 数组过滤器
- angular - 来自服务工作者的 Angular 504 与谷歌分析/adsense
- php - 使用以下语法声明 PHP var 是否有效:&$var?
- python - 想用lxml和python从某个网站提取链接和标题,但不能
- docker - 带有外部虚拟网络的 Azure API 管理服务到 Docker