>传递SQL在MS Access 2016 VBA中失败,错误Syntax error in From clause
但在Azure上的SQL Server中执行正常。
我在MS Access 2016 VBA代码中具有一个名为Qdf的查询定义。在 VBA 中设置的查询是连接到 Azure 中的 SQL Server 数据库的传递查询。连接字符串是从另一段代码中复制的,该代码工作正常。Returnsrecords property = True
.
当代码尝试填充 Qdf.SQL 字符串时,它会失败并显示消息
"From 子句中的语法错误"。
然后,当我调试并打印在"即时(调试("窗口中定义 SQL 属性的字符串时,请将打印的字符串复制到 Azure 上的查询 SQL Server Management Studio,然后执行它正常工作的查询。 所以我的结论是查询是正确的,但不知何故 MS Access 不想理解这一点。
在下面的代码中:
- RepositoryDB_Name - 在 SQL Server 中保存数据库的名称, -
- ArrAccountName(i( - 持有用户 ID,
- ArrAccountPassword(i( - 用户的密码
- 资源列表 - 在运行时"操作数据存储"、"MS MDS 主数据"中保留此测试。
RepositoryDB_Name和资源列表的内容来自/是从 Azure 中的内容构建的。
Debug.Print
"SELECT * FROM [" & RepositoryDB_Name & "].[scan].[All Data Scope] WHERE [Database Business Name] IN (" & ResourceList & ");"
结果在
"SELECT * FROM [DB_DEV].[scan].[All Data Scope] WHERE [Database Business Name] IN ('Operational Data Store', 'MS MDS Master Data')"
将此字符串的内容复制到 SQL Server 中的查询中时,它工作正常。 [所有数据范围] 是存储在 Azure 上的 SQL Server 数据库中的视图。
我还尝试将完整的[所有数据范围]查询粘贴到SQL中,然后添加条件。 同样,当您将调试的值粘贴到 SQL Server Management Studio 上的查询中时,来自调试器生成的 SQL 字符串(FROM 子句中只有 SQL Server 表(在 SQL Server 上工作正常。 这次我收到"查询表达式中的语法错误(缺少运算符("消息。 所以这里的查询似乎也适用于SQL Server,但MS Access认为这是不正确的......
如何解决这个问题? 是错误,还是我错过了什么?
ConnStr = "ODBC;Driver=ODBC Driver 17 for SQL Server;Server=" & _
RepositoryServer & ";DATABASE=" & RepositoryDB_Name & ";UID=" & ArrAccountName(i) & ";PWD=" & ArrAccountPassword(i) & _
";Authentication=ActiveDirectoryPassword;"
Set Qdf = CurrentDb.CreateQueryDef("")
Qdf.SQL = "SELECT * FROM [" & RepositoryDB_Name & "].[scan].[All Data Scope] WHERE [Database Business Name] IN (" & ResourceList & ");"
Qdf.Connect = ConnStr
发生语法错误是因为FROM [DB_DEV].[scan].[All Data Scope]
在 Access SQL 中无效。
通过在分配 QueryDef 的.SQL
属性值之前分配 QueryDef 的.Connect
值来避免该错误。
Qdf.Connect = ConnStr
Qdf.SQL = "SELECT * FROM [" & RepositoryDB_Name & "].[scan].[All Data Scope] WHERE [Database Business Name] IN (" & ResourceList & ");"
这样,Access 将意识到查询将在其他某个 DBMS 中运行,而不是尝试检查 SQL 语句是否为有效的 Access SQL。