如何通过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
相关产品推荐
相关产品推荐

