Sql server 传递查询的from子句中存在语法错误
传递SQL在MS Access 2016 VBA中失败,在From子句中出现错误Sql server 传递查询的from子句中存在语法错误,sql-server,ms-access,ms-access-2016,pass-through,Sql Server,Ms Access,Ms Access 2016,Pass Through,传递SQL在MS Access 2016 VBA中失败,在From子句中出现错误语法错误,但在Azure上的SQL Server中执行OK 我在MS Access 2016 VBA代码中有一个名为Qdf的查询定义。在VBA中设置的查询是连接到Azure中SQL Server数据库的直通查询。连接字符串是从另一段代码中复制的,这段代码可以正常工作返回记录属性=True 当代码尝试填充Qdf.SQL字符串时,它将失败并显示消息 “From子句中的语法错误” 然后,当我在即时(调试)窗口中调试并打印定
语法错误,但在Azure上的SQL Server中执行OK
我在MS Access 2016 VBA代码中有一个名为Qdf的查询定义。在VBA中设置的查询是连接到Azure中SQL Server数据库的直通查询。连接字符串是从另一段代码中复制的,这段代码可以正常工作<代码>返回记录属性=True
当代码尝试填充Qdf.SQL字符串时,它将失败并显示消息
“From子句中的语法错误”
然后,当我在即时(调试)窗口中调试并打印定义SQL属性的字符串时,将打印的字符串复制到Azure上的查询SQL Server Management Studio,然后执行该查询,它就可以正常工作了。
所以我的结论是,这个查询是正确的,但是MS Access不想理解这一点
在下面的代码中:
- RepositoryDB_Name-保存SQL Server中数据库的名称,-
- ArraAccountName(i)-保存用户ID
- ArraAccountPassword(i)-用户的密码
- ResourceList-在运行时“操作数据存储”、“MS MDS主数据”的测试中保留
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中的查询中时,它可以正常工作。
[All Data Scope]是存储在Azure上SQL Server数据库中的视图
我还尝试在SQL中粘贴完整的[All Data Scope]查询,然后添加条件。
同样,当您在SQLServerManagementStudio上的查询中粘贴调试后的值时,调试器生成的SQL字符串(from子句中只有SQLServer表)在SQLServer上工作正常。
这次我得到了“查询表达式中的语法错误(缺少运算符)”消息。
所以这里的查询对于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
出现语法错误的原因是[DB_DEV].[scan].[All Data Scope]中的
在Access SQL中无效
在分配QueryDef的.Connect
属性值之前,先分配其.SQL
属性值,以避免该错误
Qdf.Connect=ConnStr
Qdf.SQL=“从[”&RepositoryDB_Name&“]中选择*。[scan]。[All Data Scope],其中[Database Business Name]位于(“&ResourceList&”)中
这样,Access就会意识到查询将在其他一些DBMS中运行,而不会尝试检查SQL语句是否为有效的Access SQL 小心,那看起来很容易注射。如果您使用的是动态SQL,您应该正确引用对象并正确参数化WHERE
。如果在Qdf.SQL
之前分配Qdf.Connect
,是否会产生差异?是的,它会产生差异。现在它确实起作用了。非常感谢。