Access传递查询调用SQL Server报语法错误,求无链接表解决方案
解决Access Pass-Through查询连接SQL Server的报错问题
问题原因
你之前使用的是Access专属的Jet SQL语法(带IN子句的跨库查询写法),但Pass-Through查询的核心是直接将SQL语句发送给目标SQL Server执行,SQL Server无法识别Access特有的IN子句语法,因此触发语法错误。
解决方案
方法1:手动创建Pass-Through查询
- 打开Access,新建空白查询,关闭「显示表」窗口。
- 在「设计」选项卡中点击「Pass-Through」,切换为Pass-Through模式。
- 右键查询设计窗口,选择「属性」,在「ODBC连接字符串」中填入你的DSN信息,示例:
ODBC;DSN=你的DSN名称;DATABASE=NORTHWIND; - 在查询编辑窗口中写入SQL Server原生SQL语句,示例:
SELECT * FROM dbo.Products; - 运行查询即可获取数据。
方法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
相关产品推荐
相关产品推荐

