首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试从Access执行Server存储过程时出现“无效SQL语句”错误

尝试从Access执行Server存储过程时出现“无效SQL语句”错误
EN

Stack Overflow用户
提问于 2016-11-10 15:07:19
回答 2查看 4.2K关注 0票数 1

我是在一个虚拟机上操作的,我的SQL服务器和machine位于虚拟机上。我建立了从Access到SQL的ODBC连接,并链接了几个表。我可以对这些表执行通常的操作(选择/更新等)。

但是,由于一些奇怪的原因,我无法运行存储过程!这个过程在SSMS上运行得很好,但当我从Access VBA调用它时却不是这样。下面是我用来执行proc的代码(我还需要传递3个参数,但为了简单起见,我已经从下面的代码中排除了这一点):

代码语言:javascript
运行
复制
With CurrentDb.QueryDefs("qPass")
  .SQL = "exec [HS].[spGetXMLExtract]"
  .Execute
End With

MS返回的错误是

无效SQL语句:预期“删除”、“插入”、“过程”、“选择”或“更新”。

不知道这是否发生了,因为: 1.我已经在VM上得到了这些应用程序;和/或2。我需要将存储过程链接到MS访问,就像我对表所做的那样(也许这是不可能的)。

我想有些复杂的方法我可能会采用,但我不想这么做。示例:

1.使用存储参数的列在中创建一个表;在该表上编写一个AFTER UPDATE触发器,该触发器执行我的存储过程;从MS启动一个“更新”查询,该查询将更新该表中的参数,然后触发一个AFTER UPDATE触发器。或;

2.完全消除了方程中的存储过程,并执行它的单个语句(选择/更新/插入等)在MS Access中通过Sub。不过,不知道这是否会导致创建临时表的问题。

有人能给我个建议吗,这是一个真正的阻滞剂!

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-10 16:59:15

如果QueryDef没有有效的"ODBC;..."连接字符串作为其.Connect属性,您将收到该错误消息。这就是Access将QueryDef标识为传递查询的方式。

如果已经定义了ODBC链接表,则可以将其.Connect属性值用于QueryDef的.Connect属性,如下所示:

代码语言:javascript
运行
复制
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_table1").Connect  ' grab .Connect string from linked table
qdf.sql = "exec [HS].[spGetXMLExtract]"
qdf.ReturnsRecords = False
qdf.Execute

..。或者,如果存储过程实际上返回了一个结果集:

代码语言:javascript
运行
复制
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_table1").Connect  ' grab .Connect string from linked table
qdf.sql = "exec [HS].[spGetXMLExtract]"
qdf.ReturnsRecords = True
Dim rst As DAO.Recordset
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
Do Until rst.EOF
    ' do stuff
    rst.MoveNext
Loop
rst.Close
票数 2
EN

Stack Overflow用户

发布于 2016-11-10 15:36:12

我现在没有访问MS-Access的权限,但在我看来,好的语法是:

代码语言:javascript
运行
复制
`strSQL = "exec [HS].[spGetXMLExtract]"
 With CurrentDb.QueryDefs(strSQL)
'Fill parameters
 .Parameters(0) = My first param
 .Parameters(1) = My 2nd param
 .Parameters(2) = My last param
'Execute the query
 .Execute
End With `

我希望这会有帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40530836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档