2016-11-10 59 views
1

我在我的SQL Server和MS Access所在的虚拟机上运行。我建立了从Access到SQL的ODBC连接并链接了几个表。我可以对这些表执行常规操作(选择/更新等)。当试图从Access执行SQL Server存储过程时出现“无效SQL语句”错误

但是,我无法运行存储过程的一些奇怪的原因!该过程在SSMS上完美运行,但不是从Access VBA调用它时。以下是我使用执行PROC的代码(我需要传递3个参数为好,但我已经排除了从下面的代码为简单起见):

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

通过MS访问返回的错误是

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

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

我想我可能会采取复杂的方法但我不想。示例:

1.使用存储参数的列创建SQL表;在该表上写一个AFTER UPDATE触发器,该表执行我的存储过程;从MS Access中触发一个'Update'查询来更新该表中的参数,然后SQL触发器被触发。要么;

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

有人可以请告知这个,这是一个真正的阻挡者!

在此先感谢!

+1

这应该有效。你确定“qPass”是带有正确连接字符串的Pass-Through查询,并且'ReturnsRecords' = False? - 如果您手动运行该查询,该怎么办? – Andre

+1

听起来像你diad不创建查询qPass作为传递。使用SQL设计器时,请确保您单击(选择)传递选项。 ONce完成你的代码应该可以正常工作。 –

+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 
+0

谢谢@GordThompson。即使在这之后,我不知道为什么它不起作用。现在我已经使用触发器来节省时间,因为我需要遵守最后期限。但我会更深入! –

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 ` 

我希望这将帮助!

+0

Thanks @Mohamad。我不知道它为什么不起作用,我似乎有一个类似你的语法。现在我已经使用触发器来节省时间,因为我需要遵守最后期限。但我会进一步提供此主题的更新! –

+0

对不起,如果它不起作用! 你对SQL Server的访问模式是什么:ADO,OLEDB,... 我建议你看看这个链接: http://accessexperts.com/blog/2011/07/29/sql-server -stored-程序引导换微软存取部分-1 /。 希望这可以帮助.. – Mohamad

+0

'我犯了一个错误'_什么是您的访问SQL Server的模式:ADO,OLEDB,_ ... *因为* ADO = OLEDB,我应该写DOA,OLEDB等。 .. – Mohamad