输出参数和默认值不能很好地配合!这来自SQL 10.50.1617(2008 R2)。 不要被骗去相信这个构造神奇地SET
代表您达到了那个价值(就像我的同事一样)!
此“玩具” SP查询OUTPUT
参数值,无论它是默认值还是NULL
。
CREATE PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
RETURN
如果您输入的未初始化值(即NULL
),则OUTPUT
您确实NULL
进入了SP,而不是0
。有道理,该参数传递了一些东西。
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
输出为:
wtf its NULL
@QR=NULL
如果我们添加SET
来自调用方的显式信息,则会得到:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
和(毫不奇怪)的输出:
@QR=999
同样,有意义的是,传递了参数,并且SP对SET
值没有采取任何显式操作。
添加SET
了的OUTPUT
参数在SP(像你应该做的),但是没有设置从呼叫者什么:
ALTER PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
SET @QtyRetrieved = @Qty
RETURN
现在执行时:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
输出为:
wtf its NULL
@QR=1234
这是OUTPUT
SP中参数处理的“标准”行为。
现在,对于图扭曲:使默认值“激活”的唯一方法是根本不传递OUTPUT
参数,恕我直言,这毫无意义:由于将其设置为OUTPUT
参数,因此意味着返回“重要”的东西应该收集的。
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
给出以下输出:
yay its zero
@QR=NULL
但这无法捕获SP的输出,大概是该SP最初的目的。
恕我直言,此功能组合是可疑的构造,我会考虑代码气味(phe!)
NULL
传递给您的任何东西调用sproc ?”@AddressId