Sql server 通过循环Excel工作表列a中的ID,批处理对SQL DB的多个查询

Sql server 通过循环Excel工作表列a中的ID,批处理对SQL DB的多个查询,sql-server,excel,vba,azure-sql-database,Sql Server,Excel,Vba,Azure Sql Database,我尝试了几次批量处理对SQL Server数据库的几次查询回迁,以批量提取数据。如果我一次就完成了这项工作,那么对Excel来说就太多了,可能对基本SQL来说也太多了。我知道事实上SQL Server可以处理很多很多,但这不是一个SQL Server环境。。。它基本上是一个Excel环境。所以,不管怎样,我正试图找到一种方法,在数组中循序渐进地循环,并按顺序处理每个步骤 我正在尝试做这样的事情。。。查询第1-100行和进程,查询第101-200行和进程,查询第201-300行和进程等,直到数组结

我尝试了几次批量处理对SQL Server数据库的几次查询回迁,以批量提取数据。如果我一次就完成了这项工作,那么对Excel来说就太多了,可能对基本SQL来说也太多了。我知道事实上SQL Server可以处理很多很多,但这不是一个SQL Server环境。。。它基本上是一个Excel环境。所以,不管怎样,我正试图找到一种方法,在数组中循序渐进地循环,并按顺序处理每个步骤

我正在尝试做这样的事情。。。查询第1-100行和进程,查询第101-200行和进程,查询第201-300行和进程等,直到数组结束,这是一组唯一的ID,都列在列a中

下面是我正在测试的代码

Sub-TryMe()
'初始化变量
将cnn设置为新的ADODB.连接
将rst设置为新ADODB.Recordset
Dim ConnectionString作为字符串
作为字符串的Dim StrQuery
暗淡的光线和长的一样
暗淡的lCol尽可能长
将myRange设置为字符串
变暗rng作为范围,单元格作为范围
将日期设置为字符串
pswd=“pswd”
user=“user”
dbName=“DB”
server=“serverName.database.Windows.net”
'设置用于访问MS SQL数据库的连接字符串
ConnectionString=“Provider=MSDASQL;Extended Properties=”“Driver={ODBC Driver 17 for SQL Server};pwd=“&pswd&”uid=“&user&”Server=“&Server&”database=“&dbName&”“”
'打开与数据库的连接
开放连接字符串
'执行整个查询的超时错误(秒);这将在VBA超时之前运行15分钟,但您的数据库可能在此值之前超时
cnn.CommandTimeout=900
“MatDate=“'12/11/2019'”
'在列A(1)中查找最后一个非空单元格
LastRow=单元格(Rows.Count,1).End(xlUp).Row
LastFind=单元格(Rows.Count,2)。结束(xlUp)。行+1
设置rng=范围(“A2:A”和最后一行)
stepbegin=2
stepend=100
对于rng中的每个单元
myRange=“”&Join(Application.Transpose(范围(“A”&LastFind&“:A”&stepend.Value)”,“,”&“)
'myRange=左(myRange,Len(myRange)-1)
StrQuery=“从我的ID所在的myTable(“&myRange&”)中选择*”
'执行实际查询
打开StrQuery,cnn
'将StrQuery中的所有结果转储到活动工作簿中第一张工作表的单元格A2中
工作表(“表1”).范围(“A2”).记录集rst的副本
LastFind=单元格(Rows.Count,2).End(xlUp).Row
stepend=LastFind+100
下一个细胞
端接头

问题是,我不想一个单元格一个单元格地处理,而是一块一块地处理,所以一次处理100个单元格,或者一次处理1000个单元格。它必须是批处理作业。我不可能一次就做完这件事。我尝试了几种不同的方法,每次工作结束时。我对任何想法都持开放态度。越简单越好。

你看到我的评论了吗?在具有适当索引的SQL Server上执行应该比15分钟快得多。使用OleDB驱动程序而不是MSDASQL,因为使用ODBC con的速度要慢得多。我建议您一次性将每个id写入数据库表(这很快)。然后执行一个引用该表的存储过程,一次完成所有操作。@Nick.McDermaid:您不希望在工作表上(也可能在SQL Server上)使用子句中的子查询吗?无需SP或临时表。类似于
Select*FROM myTable,其中BB_ID IN(从[Sheet1$]中选择ID)和myDate<'12/11/2019'
取决于这种情况下的“处理”是什么。还取决于这是否为多用户。暂存表不适用于多用户。我只是重新阅读了问题。因此,您只是尝试将数据加载到Excel工作表中。基本问题是:为什么要将70K行加载到excel工作表中?我已经建立了一个excel用户界面,基本上可以做到这一点,我没有任何问题。