我在我的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执行单独的语句(选择/更新/插入等)。不知道这是否会导致创建临时表的问题。
有人可以就此提出建议,这是一个真正的阻挡者!
提前致谢!
答案 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 `
我希望这会有所帮助!