SQL 查询在 Excel 中不起作用,但在 Access 中起作用

Posted

技术标签:

【中文标题】SQL 查询在 Excel 中不起作用,但在 Access 中起作用【英文标题】:SQL query does not work in Excel but works in Access 【发布时间】:2021-12-30 21:47:14 【问题描述】:

对于下面列出的代码,除了第一个 SQL 查询外,它运行良好。我正在从工作簿中提取地址和状态信息,并对信息运行查询以查找地址出现在表中的次数。如果我在查询发送到 Access 之前运行代码并停止它,我可以从立即窗口中提取查询命令,转到 Access,然后运行查询没有问题。但是,如果我只是运行 VBA 程序并让它将查询发送到 Access,我会一直得到 0 的结果。长话短说,查询将在 Access 中运行并提供正确的结果,但是当 Excel VBA 将查询发送到 Access 时,我的结果一直为零(并且没有错误消息)。任何帮助将不胜感激。

Dim DatabaseFileName As String, connectionstring As String   

connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DatabaseFileName & "; Persist Security Info=False;"

Dim conn As New ADODB.Connection
conn.Open connectionstring

Dim rs As New ADODB.Recordset, SQL As String
Dim ExecSQL As New ADODB.Command

With ThisWorkbook.Sheets(1)
    For I = 2 To 1235
        SQL = ""
        If .Cells(I, 7) <> "" Then
            SQL = "SELECT Count(VRSC_CUSTOMER_SITES.SITE_ID)  AS GCOUNT into [GVRCount1] "
            SQL = SQL & "FROM (VRSC_CUSTOMER_SITES) "
            SQL = SQL & "WHERE ((VRSC_CUSTOMER_SITES.SITE_STREET Like " & Chr(34) & .Cells(I, 7) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_ST)="
            SQL = SQL & Chr(34) & .Cells(I, 5) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_PHONE) Not Like ""999*""));"
            
            rs.Open SQL, conn
            
            SQL = "SELECT * FROM [GVRCount1]"
            rs.Open SQL
            
            .Cells(I, 8).CopyFromRecordset rs
            
        End If
    Next
End With
With ThisWorkbook.Sheets(2)

    .Range("A1").CopyFromRecordset rs
    
End With

conn.Close
End Sub

【问题讨论】:

为什么第一次打开rs?打开第二个查询时,您不会使用它并立即将其丢弃。对我来说毫无意义。 是的,你是对的。所以请忽略那部分。我已经删除了“SQL =”SELECT * FROM [GVRCount1]”和“rs.Open SQL”部分。所以我基本上只是在看 SQL 的东西。我仍然遇到同样的问题。 我以前必须通过 ADODB 对 SQL 进行故障排除,因此我建议先从 SELECT * FROM [VRSC_CUSTOMER_SITES$] 之类的“不失败”SQL 语句开始,看看它是 SQL 还是您的连接。如果可行,我将注释掉并逐行测试您更复杂的 SQL 语句,取消注释(进行修改以使其仍然有效)。我从来没有查询过 MS-Access,但是当我编写 SQL 查询以针对 Excel 工作簿(用作数据库)时,我的 SQL 表写为:[Table$],“$”在结尾。仔细检查? 【参考方案1】:

本质上,问题是由LIKE 运算符引起的。每当您通过 ODBC/OLEDB 连接运行 Access 查询时,要使用的通配符是当前的 ANSI 版本 %。但是,在 Access GUI 中,通配符使用旧版本 *。请参阅 MSDN docs 讨论此通配符用​​法。

为了在 Excel 和 Access(VBA 或 GUI)之间兼容,请考虑将未记录的 ALIKE 运算符仅使用 %。此外,使用 ADO 命令使用 ADO 参数化并避免将值连接到 SQL 语句。下面将第一个LIKE 替换为=,因为没有使用通配符并且使用INTO 的生成表操作已被删除。此外,New 已从任何 Dim 行中删除。

Dim DatabaseFileName As String, connectionstring As String, SQL As String
Dim conn As ADODB.Connection, rs As ADODB.Recordset, ExecSQL As ADODB.Command
Dim I As Long

connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" _
                    & DatabaseFileName & "; Persist Security Info=False;"

Set conn = New ADODB.Connection
conn.Open connectionstring

' PREPARED STATEMENT WITH ? PLACEHOLDERS
SQL = "SELECT COUNT(v.SITE_ID) AS GCOUNT " _
    & "FROM VRSC_CUSTOMER_SITES v " _
    & "WHERE v.SITE_STREET = ? " _
    & "  AND v.SITE_ST = ? " _
    & "  AND v.SITE_PHONE NOT ALIKE '999%';" _

For I = 2 To 1235
    If ThisWorkbook.Sheets(1).Cells(I, 7) <> "" Then
        Set ExecSQL = New ADODB.Command
        With ExecSQL
            .ActiveConnection = conn
            .CommandText = SQL
            .CommandType = adCmdText

            '  BIND PARAMETERS
            .Parameters.Append .CreateParameter("street_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 7))
            .Parameters.Append .CreateParameter("st_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 5))

            '  EXECUTE QUERY AND BIND INTO RECORDSET
            Set rs = .Execute
        End With
            
        ThisWorkbook.Sheets(1).Cells(I, 8).CopyFromRecordset rs
    End If
Next I

With ThisWorkbook.Sheets(2)
    .Range("A1").CopyFromRecordset rs
End With

【讨论】:

谢谢@Parfait 和 wackojacko1997。冻糕你对百分比运算符确实是正确的。我的所有数据都使用“”作为通配符。当我将“”更改为“%”时,我的查询有效。我更简单的查询有效(根据 wacko 的建议),所以 Parfait 你的建议是有道理的。感谢大家的帮助! 很高兴听到并乐于提供帮助!不要只更改通配符,请注意parameterization!如果此解决方案有效,请参阅thanks!

以上是关于SQL 查询在 Excel 中不起作用,但在 Access 中起作用的主要内容,如果未能解决你的问题,请参考以下文章

媒体查询在 chrome 中不起作用,但在 iphone 上起作用

为啥按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好?

Power Query 参数在一个表中起作用,但在另一个表中不起作用

为啥这个 T-SQL 查询在 Synapse 中不起作用?

SQL 联接查询在 PowerShell 中不起作用

SQL查询在while循环中不起作用 - JAVA