Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 传递查询的from子句中存在语法错误_Sql Server_Ms Access_Ms Access 2016_Pass Through - Fatal编程技术网

Sql server 传递查询的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子句中的语法错误” 然后,当我在即时(调试)窗口中调试并打印定

传递SQL在MS Access 2016 VBA中失败,在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主数据”的测试中保留
RepositoryDB_Name和Resourcelist的内容来自/由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中的查询中时,它可以正常工作。 [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
,是否会产生差异?是的,它会产生差异。现在它确实起作用了。非常感谢。