【问题标题】:"Invalid SQL statement" error when trying to execute SQL Server stored procedure from Access尝试从 Access 执行 SQL Server 存储过程时出现“无效的 SQL 语句”错误
【发布时间】:2016-11-10 15:07:19
【问题描述】:

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

但是,由于某种奇怪的原因,我无法运行存储过程!该过程在 SSMS 上完美运行,但当我从 Access VBA 调用它时却没有。以下是我用来执行 proc 的代码(我还需要传递 3 个参数,但为简单起见,我已将其从下面的代码中排除):

With CurrentDb.QueryDefs("qPass")
  .SQL = "exec [HS].[spGetXMLExtract]"
  .Execute
End With

MS Access 返回的错误是

无效的 SQL 语句:预期为“DELETE”、“INSERT”、“PROCEDURE”、“SELECT”或“UPDATE”。

不知道是否会发生这种情况,因为: 1. 我在虚拟机上安装了这些应用程序;和/或 2. 我需要以某种方式将存储过程链接到 MS Access,就像我为表所做的那样(也许这无法完成)。

我想我“可能”能够采用一些复杂的方法,但我不想这样做。示例:

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

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

有人可以就此提出建议吗,这是一个真正的障碍!

提前致谢!

【问题讨论】:

  • 这应该可以。您确定 "qPass" 是具有正确连接字符串的直通查询,并且 ReturnsRecords = False 吗? -- 如果您手动运行该查询会怎样?
  • 听起来您没有创建查询 qPass 作为传递。使用 SQL 设计器时,请确保单击(选择)传递选项。完成后,您的代码应该可以正常工作。
  • 谢谢大家。我不知道为什么它不起作用,查询对我来说似乎是通过。现在我使用触发器来节省时间,因为我需要在最后期限之前完成。但我会更进一步!

标签: sql-server ms-access stored-procedures


【解决方案1】:

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

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

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

...或者,如果存储过程确实返回了结果集:

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

【讨论】:

  • 感谢@GordThompson。我不知道为什么即使在此之后它也不起作用。现在我使用触发器来节省时间,因为我需要在最后期限之前完成。但我会更进一步!
【解决方案2】:

我现在无法访问 MS-Access,但在我看来,好的语法是:

`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 `

希望对你有帮助!

【讨论】:

  • 谢谢@Mohamad。我不知道为什么它不起作用,我的语法似乎与您的相似。现在我使用触发器来节省时间,因为我需要在最后期限之前完成。但我会进一步深入,并提供有关此线程的更新!
  • 对不起,如果它不起作用!您访问 SQL Server 的模式是什么:ADO、OLEDB、... 我建议您看看这个链接:Http://accessexperts.com/blog/2011/07/29/…。希望这可以帮助..
  • I made a mistake in writing 你访问 SQL Server 的模式是什么:ADO、OLEDB、 ... 因为 ADO = OLEDB,我应该写DOA、OLEDB 等 ...
猜你喜欢
  • 2022-10-07
  • 2023-03-17
  • 2012-11-07
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
相关资源
最近更新 更多