Ausgabeparameter und Standardwerte funktionieren nicht gut zusammen! Dies ist aus SQL 10.50.1617 (2008 R2). Lassen Sie sich nicht täuschen, wenn Sie glauben, dass dieses Konstrukt SETin Ihrem Namen auf magische Weise einen Wert hat (wie es mein Kollege getan hat)!
Dieses "Spielzeug" SP fragt den OUTPUTParameterwert ab, ob es sich um den Standardwert handelt oder nicht 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
Wenn Sie einen nicht initialisierten Wert (dh NULL) für das senden OUTPUT, sind Sie wirklich NULLin den SP gelangt und nicht 0. Sinnvoll, für diesen Parameter wurde etwas übergeben.
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
Ausgabe ist:
wtf its NULL
@QR=NULL
Wenn wir eine explizite SETvom Anrufer hinzufügen, erhalten wir:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
und die (nicht überraschende) Ausgabe:
@QR=999
Auch hier ist es sinnvoll, einen Parameter zu übergeben und SP hat keine explizite Aktion für SETeinen Wert ausgeführt.
Fügen Sie einen SETder OUTPUTParameter im SP hinzu (wie Sie es tun sollen), aber legen Sie nichts vom Aufrufer fest:
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
Jetzt, wenn ausgeführt:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
Die Ausgabe ist:
wtf its NULL
@QR=1234
Dies ist das "Standard" -Verhalten für die OUTPUTParameterbehandlung in SPs.
Nun zum Plot Twist : Die einzige Möglichkeit, den Standardwert zum "Aktivieren" zu erhalten, besteht darin , den OUTPUTParameter überhaupt nicht zu übergeben , was meiner Meinung nach wenig Sinn macht: Da er als OUTPUTParameter eingerichtet ist, würde dies bedeuten, etwas "Wichtiges" zurückzugeben. das sollte gesammelt werden.
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
gibt diese Ausgabe:
yay its zero
@QR=NULL
Dies erfasst jedoch nicht die SP-Ausgabe, vermutlich zunächst den Zweck dieses SP.
IMHO ist diese Feature-Kombination ein zweifelhaftes Konstrukt, das ich als Code-Geruch betrachten würde (Puh !!)
NULLSie sich entscheiden,@AddressIdwenn eine Adresse nicht existiert, ohne einen Zweig zu verwenden?"