Sql 对整个列执行一次查询,而不是遍历所有单元格

Sql 对整个列执行一次查询,而不是遍历所有单元格,sql,sql-server,excel,vba,ado,Sql,Sql Server,Excel,Vba,Ado,我使用下面的循环遍历一列并对每个单元格值执行查询。鉴于此列中的单元格数量很容易超过10000行,这不是一种非常快速的方法,因此我正在研究另一种提高性能的方法 我正在考虑用单元格的值填充一个数组,但是使用这种方法,很可能仍然需要遍历所述数组并为每次迭代执行查询 我不熟悉任何可能执行一次查询的方法,或者至少不熟悉任何可以显著提高此过程性能的方法。有什么想法吗 公共函数getdata(作为字符串查询)作为ADODB.Recordset 将cnn设置为ADODB.Connection 将字符串变为字符串

我使用下面的循环遍历一列并对每个单元格值执行查询。鉴于此列中的单元格数量很容易超过10000行,这不是一种非常快速的方法,因此我正在研究另一种提高性能的方法

我正在考虑用单元格的值填充一个数组,但是使用这种方法,很可能仍然需要遍历所述数组并为每次迭代执行查询

我不熟悉任何可能执行一次查询的方法,或者至少不熟悉任何可以显著提高此过程性能的方法。有什么想法吗

公共函数getdata(作为字符串查询)作为ADODB.Recordset 将cnn设置为ADODB.Connection 将字符串变为字符串 设置cnn=newadodb.Connection connstring=“Provider=SQLOLEDB;数据源=noneofyourbusiness;连接超时=180” 美国有线电视新闻网,打开字符串 Set getdata=New ADODB.Recordset getdata.CursorLocation=adUseClient getdata.Open查询,connstring,2,adLockReadOnly 端函数 次启动() “代码。。。 对于短范围内的每个c(“J3:J”和LRow) 如果不是c.Value=“”,则 "质疑, 设置rs=getdata(“在UDFV.TableLinkId=AT.Id,其中UDFV.Userfield13Id='5029'和AT.Code='”&c.Value&“')上,从UDFV上的AsAssetTypesUdfv UDFV的AsAssetTypes中选择“选中”) 如果不是卢比,那么 短单元格(c行,“L”)。从记录集复制 带短小范围(短小单元格(c.Row,“A”)、短小单元格(c.Row,LCol)).Font .ThemeColor=xlThemeColorDark1 .TintAndShade=-0.349986266670736 以 rs.Close 如果结束 如果结束 下一个c “代码。。。 端接头 方法1

如果SQL上有dbo,那么创建一个临时表并在那里加载Excel数据。使用一种高效的字符串构建方法(即使用Mid替换而不是常量连接)一次性完成。或者使用集成直接加载数据。运行查询并将数据放回。找出哪些单元格需要格式化,并立即进行(使用Union循环以获得一个大范围)

方法2

使用客户端游标,从SQL加载所有数据,并使用rs.Filter查找匹配的记录。您可以将Excel数据加载到数组或断开连接的记录集中,然后将其放回

重要的是不要不必要地回写Excel。写入Excel的次数不应超过两次

类似(未完全测试的代码)

Dim rsLocal As ADODB.Recordset'创建一个本地的、断开连接的记录集
Set rsLocal=New ADODB.Recordset
rsLocal.CursorLocation=adUseClient
rsLocal.Fields.Append“L”,adVarChar,1024,adFldIsNullable'更改以适合您的数据
rsLocal,打开
将myRange变暗为Range
rs.CursorLocation=adUseClient
'将所有记录重新存入内存
设置rs=GetData(“在UDFV.TableLinkId=AT.Id,其中UDFV.Userfield13Id='5029'和AT.Code='”)上加入astAssetTypesUDFV UDFV的astAssetTypes中选择'Checked',AT.Code代码)
对于短范围内的每个c(“J3:J”和lrow)
rsLocal.AddNew
如果c.值为“”,则
rs.Filter=“Code=”&c.Value&“”'使用Filter防止大量往返
如果rs.RecordCount为0,则
先走一步
rsLocal(“L”)=rs(“代码”)
'将单元格添加到范围中
如果myRange是空的,那么
设置myRange=sht.Range(sht.cells(c.Row,“A”)、sht.cells(c.Row,LCol))
其他的
设置myRange=Union(短范围(短单元格(c.Row,“A”)、短单元格(c.Row,LCol)),myRange)
如果结束
如果结束
如果结束
rsLocal.Update
下一个
rsLocal.MoveFirst
sht.Range(“L3”).CopyFromRecordset rsLocal“一次写入所有更新”
使用myRange.Font“一次执行所有格式设置”
.ThemeColor=xlThemeColorDark1
.TintAndShade=-0.349986266670736
以
方法1

如果SQL上有dbo,那么创建一个临时表并在那里加载Excel数据。使用一种高效的字符串构建方法(即使用Mid替换而不是常量连接)一次性完成。或者使用集成直接加载数据。运行查询并将数据放回。找出哪些单元格需要格式化,并立即进行(使用Union循环以获得一个大范围)

方法2

使用客户端游标,从SQL加载所有数据,并使用rs.Filter查找匹配的记录。您可以将Excel数据加载到数组或断开连接的记录集中,然后将其放回

重要的是不要不必要地回写Excel。写入Excel的次数不应超过两次

类似(未完全测试的代码)

Dim rsLocal As ADODB.Recordset'创建一个本地的、断开连接的记录集
Set rsLocal=New ADODB.Recordset
rsLocal.CursorLocation=adUseClient
rsLocal.Fields.Append“L”,adVarChar,1024,adFldIsNullable'更改以适合您的数据
rsLocal,打开
将myRange变暗为Range
rs.CursorLocation=adUseClient
'将所有记录重新存入内存
设置rs=GetData(“在UDFV.TableLinkId=AT.Id,其中UDFV.Userfield13Id='5029'和AT.Code='”)上加入astAssetTypesUDFV UDFV的astAssetTypes中选择'Checked',AT.Code代码)
对于短范围内的每个c(“J3:J”和lrow)
rsLocal.AddNew
如果c.值为“”,则
rs.Filter=“Code=”&c.Value&“”'使用Filter防止大量往返
如果rs.RecordCount为0,则
先走一步
rsLocal(“L”)=rs(“代码”)
'将单元格添加到范围中
如果myRange是空的,那么
设置myRange=sht.Range(sht.cells(c.Row,“A”)、sht.cells(c.Row,LCol))
其他的
设置myRange=Union(短范围(短单元格(c.Row,“A”)、短单元格(c.Row,LCol)),myRange)
如果结束
如果结束
如果结束
rsLocal.Update
下一个
rsLocal.MoveFirst
sht.Range(“L3”).CopyFromRecordset rsLocal“一次写入所有更新”
使用myRange.Font'd