MS Access调用SQL Server存储过程

iho*_*rko 13 sql-server ms-access vba stored-procedures ms-access-2007

我有一个MS Access应用程序,其中包含链接到SQL Server的所有表,因此在MS Access VBA代码或查询中我使用这些表非常简单,我通过名称访问它们,如[Customers].

我在SQL Server中有一个存储过程sp_CopyData,我需要从我的VBA代码调用它.如何在不创建与SQL Server的新连接的情况下执行此操作(我已经在某处!?因为我可以访问表)?

或者这不可能?感谢任何帮助.谢谢!

iho*_*rko 21

找到正确的答案,应该是这样的:

Dim qdef As DAO.QueryDef
Set qdef = CurrentDb.CreateQueryDef("")
qdef.Connect = CurrentDb.TableDefs("[ANY LINKED TABLE TO MS SQL SERVER]").Connect
qdef.SQL = "EXEC sp_CopyData"
qdef.ReturnsRecords = False  ''avoid 3065 error
qdef.Execute
Run Code Online (Sandbox Code Playgroud)

  • 对于任何使用它来运行不返回任何内容的存储过程,您可能会得到"(3065)无法执行选择查询".像我这样的错误.我可以通过在执行查询之前添加行`qdef.ReturnsRecords = False来解决此问题. (4认同)

Alb*_*lal 13

创建pass-though查询,然后您可以在需要执行某些T-SQL时随时使用WHOLE应用程序.

代码变为:

With CurrentDb.QueryDefs("qPass")
  .SQL = "exec sp_copydata"
  .ReturnsRecords = False  ''avoid 3065 error
  .Execute
End With
Run Code Online (Sandbox Code Playgroud)

  • 它使用ihorko和Kallal的两个输入对我有用,但是缺少一个小块:DAO.QueryDef对象上的`.ReturnsRecords = False`. (9认同)

小智 6

MS Access中的代码适用于我:

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=[DB];Data Source=[PC];Integrated Security=SSPI;"
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_CopyData"
cmd.Parameters.Append cmd.CreateParameter("@param", adVarChar, adParamInput, 255, param)
cmd.Execute
Run Code Online (Sandbox Code Playgroud)