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

使用sp_executesql返回null的存储过程输出参数,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我试图确定.Net中的db调用在输出参数下失败的原因。我正在用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

我试图确定.Net中的db调用在输出参数下失败的原因。我正在用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?

您需要在存储过程调用中将
@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

为什么在这里使用动态sql?这应该是一个直接的存储过程调用……不需要动态sql。这是一个跟踪的输出。我现在想知道是否是sqlText(而不是proc)调用导致了这种sql。我已经用另一种方法让它工作了。谢谢你的回复。应用程序现在正在正确发送sql,并且跟踪看起来像您答案中的第二个示例。至少我现在知道原始跟踪中缺少了什么,以使其按预期工作。