我试图确定为什么.Net中的数据库调用失败并带有输出参数。我使用Dapper ORM来进行调用,这是跟踪的一个简单的样本。它使用sp_executesql
来参数化调用,我认为输出参数存在问题。
考虑以下代码:
CREATE PROC test
@addressId INT = NULL OUTPUT
AS
-- using select and set to see if if makes a difference using either
select @addressId = 1
SET @addressId = 1
GO
declare @p3 int
set @p3=NULL
exec sp_executesql N'test',N'@addressId int output',@addressId=@p3 output
select @p3
我希望select @p3
返回1,为什么它会返回null?
答案 0 :(得分:2)
您需要在存储过程调用中显式声明@addressId
作为输出参数,方法与使用动态SQL时完全相同:
declare @p3 int
set @p3=NULL
exec sp_executesql N'EXEC test @addressId=@addressId OUTPUT',N'@addressId int output',@addressId=@p3 output
select @p3
如果没有动态SQL,代码必须是:
declare @p3 int
set @p3=NULL
EXEC test @addressId=@p3 OUTPUT
select @p3