【问题标题】:How to overcome resource limitation of IN operator in Microsoft SQL Server如何克服 Microsoft SQL Server 中 IN 运算符的资源限制
【发布时间】: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


【解决方案1】:

你应该像related post一样将数据传输到SQL Server

Sub UpdateTable()

    Dim cnn As Object
    Dim wbkOpen As Workbook
    Dim objfl As Variant
    Dim rngName As Range
    Workbooks.Open "C:\your_path_here\Excel_to_SQL_Server.xls"
    Set wbkOpen = ActiveWorkbook
    Sheets("Sheet1").Select
    Set rngName = Range(Range("A1"), Range("A1").End(xlToLeft).End(xlDown))
    rngName.Name = "TempRange"
    strFileName = wbkOpen.FullName
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
    nSQL = "INSERT INTO [odbc;Driver={SQL Server};Server=Server_Name;Database=[Your_Database].[dbo].[TBL]]"
    nJOIN = " SELECT * from [TempRange]"
    cnn.Execute nSQL & nJOIN
    MsgBox "Uploaded Successfully"
    wbkOpen.Close
    Set wbkOpen = Nothing

End Sub

然后你可以做任何你想做的事情 - 使用运算符 IN 或 LEFT JOIN 在 SQL 服务器端检查 null。

如果您不关闭连接,您可以使用临时表 - 临时表仅存在于会话级别。

这是 VBA 代码的方式。

第二种方式 - 您可以使用 SSIS 包来处理 excel 文件。在包中,您将有相同的步骤 - 数据流将数据从 excel 传输到服务器,然后运行 ​​sql 代码来连接数据。或者你可以使用连接块inside SSIS package

如果 SQL Server 中的数据少于 excel 行数限制,您可以实施的第三种方式。您可以将 SQL 中的数据导入 Excel 工作表,然后使用 VLOOKUP() 函数连接表并查找相关数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多