使用sp_executesql返回null的存储过程输出参数
我试图确定.Net中的db调用在输出参数下失败的原因。我正在用ORM打电话,这是一个简单的跟踪样本。它使用使用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
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,并且跟踪看起来像您答案中的第二个示例。至少我现在知道原始跟踪中缺少了什么,以使其按预期工作。