使用sp_executesql返回null的存储过程输出参数

时间:2016-04-20 19:30:46

标签: sql sql-server stored-procedures

我试图确定为什么.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?

1 个答案:

答案 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