我有下面的 VBA 子程序。它将成功运行存储过程,但我想通过查看返回值来知道存储过程是否运行成功。到目前为止我无法单独使用VBA获得返回值。存储过程正在删除并创建一个表。
Public Sub New_Report_2()
Dim strConnection As String, db As DAO.Database, rs As Recordset, qd As QueryDef
Set db = CurrentDb
strConnection = "ODBC;DRIVER=SS;SERVER=x;DATABASE=y;Trusted_Connection=Yes"
' Create a temporary QueryDef object to retrieve data from a Microsoft SQL Server database.
Set qd = db.CreateQueryDef("")
With qd
.Connect = strConnection
.ODBCTimeout = 200
.sql = "exec myschema.month_end_01"
.ReturnsRecords = True
Set rs = .OpenRecordset()
If (rs.BOF And rs.EOF) Then
Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
Else
Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
End If
End With
End Sub
我收到此错误:
我尝试了另一种方式:
Public Sub New_Report_2()
Dim strConnection As String, db As DAO.Database, rs As Recordset, qd As QueryDef
Set db = CurrentDb
' strConnection = fnstrConnection
strConnection = "ODBC;DRIVER=SQL Server;SERVER=x;DATABASE=y;Trusted_Connection=Yes"
' Create a temporary QueryDef object to retrieve data from a Microsoft SQL Server database.
Set qd = db.CreateQueryDef("")
With qd
.Connect = strConnection
.ODBCTimeout = 200
.sql = "declare @return_value int" & vbCrLf
.sql = .sql + "exec @return_value = myschema.my_sp" & vbCrLf
.sql = .sql + "select 'Return Value' = @return_value"
.ReturnsRecords = True
Debug.Print .sql
Set rs = .OpenRecordset()
If (rs.BOF And rs.EOF) Then
Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
Else
Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
End If
End With
End Sub
然后我收到此错误:
如果我像这样在直通查询中调用存储过程,那么我可以获得返回值,但如果不需要,我不想创建直通查询。
Public Sub New_Report_3()
Dim db As DAO.Database, rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Test Pass Thru")
If (rs.BOF And rs.EOF) Then
Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
Else
Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
End If
End Sub
谢谢大家的宝贵时间,我很感激。
猜猜我想到了什么。 我的第二个例子在这一行中有一个缺少“=”的拼写错误:
之前:
.sql = .sql + "exec @return_value myschema.my_sp" & vbCrLf
之后:
.sql = .sql + "exec @return_value = myschema.my_sp" & vbCrLf
现在返回值已返回。
但是,如果有更优雅的方法来做到这一点,我很想知道。再次谢谢大家。
我认为,最好的方法是在 SQL Server 中创建存储过程。也可以是这样的。
CREATE PROCEDURE [dbo].[test]
AS
BEGIN
DECLARE @return_value int
set @return_value=10
select 'Return Value' = @return_value
END
GO
我使用 Microsoft ActiveX 数据对象 (ADO) 作为数据访问技术。
Private Sub TestRun()
Dim cn As New adodb.Connection
cn.ConnectionString = "Provider='SQLOLEDB';Data Source='x';Initial Catalog='y';Integrated Security='SSPI';"
cn.Open
Dim rs As New adodb.Recordset
Dim cmd_SQLCommand As adodb.Command
Set cmd_SQLCommand = New adodb.Command
cmd_SQLCommand.CommandText = "test"
cmd_SQLCommand.CommandType = adCmdText
cmd_SQLCommand.ActiveConnection = cn
Set rs = cmd_SQLCommand.Execute()
MsgBox rs.Fields(0).Value
End Sub