You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过VBA执行Excel单元格存储的SQL查询,解决AND关键字附近语法错误

问题根源

报错Incorrect syntax near the keyword 'and'的直接原因是你的SQL语句存在语法错误,同时VBA拼接SQL的逻辑也有问题,具体修复方案如下:

修复步骤

1. 修正SQL语法

你当前写的SQL存在多余括号、WHERE子句位置错误、参数占位不完整的问题,正确的查询逻辑应该为:

SELECT a.isin
FROM Risk.BenchmarkFipFwdMainPort a
WHERE a.ValueDate = '你的日期值'
AND a.Isin NOT IN (
    SELECT b.isin 
    FROM Risk.BenchmarkFipCurrMainPort b 
    WHERE b.ValueDate = '你的日期值'
)

2. 调整Excel中存储的SQL模板

将单元格B1的内容修改为带占位符的模板,方便后续统一替换日期:

SELECT a.isin
FROM Risk.BenchmarkFipFwdMainPort a
WHERE a.ValueDate = '{date}'
AND a.Isin NOT IN (
    SELECT b.isin 
    FROM Risk.BenchmarkFipCurrMainPort b 
    WHERE b.ValueDate = '{date}'
)

3. 修改VBA的SQL拼接逻辑

替换原来直接拼接字符串的写法,统一替换所有日期占位符:

Worksheets("Oversikt over papirer inn-ut").Range("A3:C10000").ClearContents

Set cn = New ADODB.Connection
 cn.Open "Provider=sqloledb;" & _
     "Data Source=NBDBAG-DM1P,60000;" & _
     "Initial Catalog=PRADA;Integrated Security=SSPI"

' 读取模板并替换日期
Dim sqlTemplate As String
sqlTemplate = Worksheets("Oversikt over papirer inn-ut").Range("B1").Value
Src = Replace(sqlTemplate, "{date}", myDate)
' 可选调试:在立即窗口输出完整SQL,可复制到SQL Server先验证语法
Debug.Print Src

Set rs = New ADODB.Recordset
With rs
     .Open Source:=Src, ActiveConnection:=cn
     
    ' 写入字段名
    For Col = 0 To rs.Fields.Count - 1
        Worksheets("Oversikt over papirer inn-ut").Range("A3").Offset(0, Col).Value = rs.Fields(Col).Name
    Next
     
    ' 写入查询结果
    Worksheets("Oversikt over papirer inn-ut").Range("A4").CopyFromRecordset rs
End With

rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

优化建议(可选)

如果存在日期格式不兼容的问题(比如不同区域的日期字符串格式不同导致SQL识别错误),建议改用参数化查询,避免SQL注入风险同时解决格式问题:

' 替换上述拼接SQL和打开记录集的逻辑
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cn
cmd.CommandText = "SELECT a.isin FROM Risk.BenchmarkFipFwdMainPort a WHERE a.ValueDate = ? AND a.Isin NOT IN (SELECT b.isin FROM Risk.BenchmarkFipCurrMainPort b WHERE b.ValueDate = ?)"
' 添加两个日期参数
cmd.Parameters.Append cmd.CreateParameter(, adDate, adParamInput, , myDate)
cmd.Parameters.Append cmd.CreateParameter(, adDate, adParamInput, , myDate)
Set rs = cmd.Execute()

内容的提问来源于stack exchange,提问作者Petter Løkken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:24:02