如何通过DAO传递查询从存储过程中检索输出值

时间:2017-09-07 00:00:13

标签: sql-server ms-access stored-procedures return-value dao

我正在将ADP转换为ACCDB(链接到SQL Server的表/视图),并且在DAO传递查询方面运气良好。我遇到的一个问题是从存储过程中检索OUTPUT参数。

SP具有以下参数

(@IType int, @RetVal bit OUTPUT) 

,简单来说,就是以下处理逻辑

IF @IType = 1
    SET @RetVal = (SELECT ... 
. . . 

不会返回任何记录。 Access VBA过程所需要的只是RetVal。

我在网上搜索过,解决方案倾向于将值写入表格或使用ADODB。

我真的想避免修改存储过程,因为更改必须传播到多个数据库。

此外,坚持使用DAO传递会很好,因为我已经开始了这条路径。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:3)

是的,您可以创建使用匿名代码块的传递查询来检索OUTPUT参数。对于存储过程

CREATE PROCEDURE [dbo].[IsOne] 
    @IType INT = 0, 
    @RetVal BIT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    IF @IType = 1
        SET @RetVal = 1;
    ELSE
        SET @RetVal = 0;
END

你可以像这样使用VBA代码:

Option Compare Database
Option Explicit

Sub ptqTest()
    Dim cdb As DAO.Database
    Set cdb = CurrentDb
    Dim ptq As DAO.QueryDef
    Set ptq = cdb.CreateQueryDef("")  ' temporary pass-through query
    ptq.Connect = "ODBC;DSN=SQLmyDb"
    ptq.ReturnsRecords = True
    ptq.SQL = _
            "DECLARE @rv BIT;" & _
            "EXEC dbo.IsOne @IType = 3, @RetVal = @rv OUTPUT;" & _
            "SELECT @rv;"
    Dim rs As DAO.Recordset
    Set rs = ptq.OpenRecordset
    ' BIT value 0 will map to False in this case
    Debug.Print "stored procedure returned " & rs(0)  
    rs.Close
    Set rs = Nothing
    Set ptq = Nothing
    Set cdb = Nothing
End Sub