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

Access传递查询调用SQL Server报语法错误,求无链接表解决方案

解决Access Pass-Through查询连接SQL Server的报错问题

问题原因

你之前使用的是Access专属的Jet SQL语法(带IN子句的跨库查询写法),但Pass-Through查询的核心是直接将SQL语句发送给目标SQL Server执行,SQL Server无法识别Access特有的IN子句语法,因此触发语法错误。

解决方案

方法1:手动创建Pass-Through查询

  1. 打开Access,新建空白查询,关闭「显示表」窗口。
  2. 在「设计」选项卡中点击「Pass-Through」,切换为Pass-Through模式。
  3. 右键查询设计窗口,选择「属性」,在「ODBC连接字符串」中填入你的DSN信息,示例:
    ODBC;DSN=你的DSN名称;DATABASE=NORTHWIND;
    
  4. 在查询编辑窗口中写入SQL Server原生SQL语句,示例:
    SELECT * FROM dbo.Products;
    
  5. 运行查询即可获取数据。

方法2:用VBA创建临时Pass-Through查询(满足临时查询需求)

以下代码会创建临时查询、执行并获取数据,无需保存查询对象:

Sub GetSQLServerData()
    Dim tempQdf As QueryDef
    Dim dataRs As Recordset
    
    ' 创建临时查询定义
    Set tempQdf = CurrentDb.CreateQueryDef("")
    ' 设置ODBC连接(替换为你的DSN名称)
    tempQdf.Connect = "ODBC;DSN=你的DSN名称;DATABASE=NORTHWIND;"
    ' 指定查询返回记录(执行更新/删除操作时设为False)
    tempQdf.ReturnsRecords = True
    ' 写入SQL Server原生查询语句
    tempQdf.SQL = "SELECT * FROM dbo.Products;"
    
    ' 执行查询并获取记录集
    Set dataRs = tempQdf.OpenRecordset(dbOpenDynaset)
    
    ' 示例:处理记录(输出到VBA立即窗口)
    If Not dataRs.EOF Then
        dataRs.MoveFirst
        Do While Not dataRs.EOF
            Debug.Print "产品名称:" & dataRs("ProductName")
            dataRs.MoveNext
        Loop
    End If
    
    ' 清理资源
    dataRs.Close
    Set dataRs = Nothing
    Set tempQdf = Nothing
End Sub

关键注意事项

  • Pass-Through查询的SQL必须完全遵循SQL Server语法,不能使用Access Jet SQL的特殊语法(比如TOP 10要改为TOP (10))。
  • 若你的DSN已配置默认数据库,连接字符串中可省略DATABASE=NORTHWIND;。
  • 执行无返回结果的操作(如INSERT/UPDATE/DELETE)时,将ReturnsRecords设为False即可。

内容的提问来源于stack exchange,提问作者zoransohrid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:06:11