【发布时间】:2021-06-09 00:37:15
【问题描述】:
我试图通过 Excel VBA 宏使用 IN 运算符在 WHERE 子句中传递 37K 值。但是,由于 Microsoft SQL Server 中的资源限制,查询不会执行。我尝试在 VBA 中传递数组中的值,并尝试在 SQL 中创建列表。两者都无法容纳这么多的值。有人可以帮忙吗?分享我在下面尝试过的代码。
Dim i as Long
Dim str As String
Dim dict_pn
Set dict_pn = CreateObject("Scripting.Dictionary")
i = 1
With InputS
For i = 1 to 50000
str = Trim(.Cells(i, PN_Col).Value)
dict_pn.Add str, 0
Next
With rsPubs
' Assign the Connection object.
.ActiveConnection = cnPubs
.Open Worksheets("SQL Script").Range("A1") & "('" & Join(dict_pn.keys, "','") & "') " & Worksheets("SQL Script").Range("A2") & "('" & Join(dict_pn.keys, "','") & "') " & Worksheets("SQL Script").Range("A3") & "('" & Join(dict_pn.keys, "','") & "') "
ActiveWorkbook.Worksheets("SQL Results").Range("A3").CopyFromRecordset rsPubs
【问题讨论】:
-
您将它们放在一个表中然后加入 - 您无法“克服”限制。
-
到底为什么要使用
IN子句传递37K 值?这不仅是一个巨大的资源猪,它的表现就像一条断了三条腿的狗。将它们放入临时表中,然后在该表上执行 JOIN。 -
@KenWhite 当我尝试创建临时表时,即使这样也会引发错误,提示我无法插入超过 1000 行
-
@Maxim 在下面发布了一个答案,该答案将超过 1000 行。
标签: sql-server excel vba