輸出參數和默認值不很好地協同工作!這來自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
)發送,你真的得到了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
一個值。
在SP添加SET
的OUTPUT
參數(就像你應該做的),但是沒有設置從主叫什麼:執行時
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
參數,這意味着要返回應該收集的「重要」內容。
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
給出了這樣的輸出:
yay its zero
@QR=NULL
但這沒能把握住SP的輸出,即SP開始與可能的目的。
恕我直言,這個功能組合貌合神離構建我會考慮代碼味道(唷!)
什麼是你的代碼是什麼樣子?也就是說,你在分支地址是否存在地址。我懷疑我的問題,一旦看到那個分支,就會說:「爲什麼在地址不存在時爲'@ AddressId'傳遞的任何內容都用'NULL'調用sproc,*不使用分支? – ruffin 2017-10-18 17:19:38