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

时间:2016-11-10 15:07:19

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

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

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

awk '{ print $1, gensub("[^0-9]+", "", "g", $2), gensub("[^0-9]+", "", "g", $3), $4, $7 }'

MS Access返回的错误是

  

无效的SQL语句:预期'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE'。

不知道是否发生这种情况是因为: 我在VM上有这些应用程序;和/或 2.我需要以某种方式将存储过程链接到MS Access,就像我对表所做的那样(可能无法完成)。

我想我可能会采用复杂的方法,但我不想这样做。例如:

1。在SQL中创建一个包含存储参数的列的表;在该表上写一个With CurrentDb.QueryDefs("qPass") .SQL = "exec [HS].[spGetXMLExtract]" .Execute End With 触发器,执行我的存储过程;从MS Access触发“更新”查询,该查询将更新该表中的参数,然后触发SQL触发器。 OR;

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

有人可以就此提出建议,这是一个真正的阻挡者!

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果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

答案 1 :(得分:1)

我现在无法访问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 `

我希望这会有所帮助!