我正在将ADP转换为ACCDB(链接到SQL Server的表/视图),并且在DAO传递查询方面运气良好。我遇到的一个问题是从存储过程中检索OUTPUT参数。
SP具有以下参数
(@IType int, @RetVal bit OUTPUT)
,简单来说,就是以下处理逻辑
IF @IType = 1
SET @RetVal = (SELECT ...
. . .
不会返回任何记录。 Access VBA过程所需要的只是RetVal。
我在网上搜索过,解决方案倾向于将值写入表格或使用ADODB。
我真的想避免修改存储过程,因为更改必须传播到多个数据库。
此外,坚持使用DAO传递会很好,因为我已经开始了这条路径。
有没有办法实现这个目标?
答案 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