sql - 来自存储过程的 VBA 返回值“指定了太多参数”
问题描述
我有一个存储过程,它返回值 0 或 1,具体取决于提供的 Windows 用户名是否存在于表中。
我添加了 VBA 来执行存储过程并处理返回值,因此我可以将其用作变量,但代码在该Execute
阶段失败:
[Microsoft][ODBC SQL Server Driver][SQL Server]过程或函数“x01_sl_getUserExists”指定的参数过多。
存储过程在这里简化:
USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Procedure]
@windowsAD nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @usrStatus int
SELECT @usrStatus = COUNT(1) FROM [SYS_Login] as lgn WHERE lgn.[SYS_LoginAD] = @windowsAD;
RETURN @usrStatus
END
要在此处执行并返回的 VBA 代码:
Dim db As ADODB.Connection
Dim pr As ADODB.Parameter
Dim pr2 As ADODB.Parameter
Dim sp2 As ADODB.Command
Dim usrStatus as Integer
Set db = New ADODB.Connection
Set sp2 = New ADODB.Command
Set pr = sp2.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
Set pr2 = sp2.CreateParameter("@windowsAD", adVarChar, adParamInput, 50, getUserID)
With sp2
.CommandText = "Procedure"
.CommandType = adCmdStoredProc
.ActiveConnection = db
.Parameters.Refresh
.Parameters.Append pr
.Parameters.Append pr2
End With
sp2.Execute '// CODE FAILS HERE
usrStatus = sp2.Parameters("@return_value")
本质上,我想获得 0(用户不存在)或 1(用户确实存在)的 RETURN 值,因此我可以将其分配给变量usrStatus
并从那里开始。
解决方案
.Parameters.Refresh
通过Parameters
转到服务器并读取过程的元数据来填充集合。
然后手动添加相同的参数,最终得到四个参数而不是两个。
要么删除Refresh
,要么不手动创建参数。
推荐阅读
- java - 如何使用文档侦听器来识别活动 Eclipse 编辑器窗口中的更改?
- java - 无法在 iFrame 中找到单选按钮
- sql - 2 行与 2000 行同时返回的查询是什么?
- quarkus - 使用 kotlin + quarkus 注入一些依赖项时出错
- jenkins - 如何在 Jenkins 管道运行之间共享多个 Docker 缓存?
- azure - 来自空主机名的 Azure 应用程序网关重定向
- python - 如何查看dict.__getitem__()方法的源码
- java - 多个主体调用一个观察者的观察者模式
- python - 熊猫气流错误:AttributeError:'Pendulum'对象没有属性'nanosecond'
- javascript - 如何在高位图表中更改输入位置?