输出参数和默认值不能很好地协同工作!这来自 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
如果您为OUTPUT 发送一个未初始化的值(即NULL),那么您在SP 中确实得到了NULL,而不是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 一个值采取显式操作。
在 SP 中添加 OUTPUT 参数的 SET(就像你应该做的那样),但不要从调用者那里设置任何东西:
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
这是 SP 中 OUTPUT 参数处理的“标准”行为。
现在对于情节扭曲:获得“激活”默认值的唯一方法是根本不传递OUTPUT 参数,恕我直言没有什么意义:因为它设置为OUTPUT 参数,这意味着返回应该收集的“重要”内容。
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
给出这个输出:
yay its zero
@QR=NULL
但这无法捕获 SP 的输出,大概是该 SP 开始的目的。
恕我直言,这个功能组合是一个可疑的构造,我会认为是 代码气味(呸!!)