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 SET
in Ihrem Namen auf magische Weise einen Wert hat (wie es mein Kollege getan hat)!
Dieses "Spielzeug" SP fragt den OUTPUT
Parameterwert 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 NULL
in 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 SET
vom 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 SET
einen Wert ausgeführt.
Fügen Sie einen SET
der OUTPUT
Parameter 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 OUTPUT
Parameterbehandlung in SPs.
Nun zum Plot Twist : Die einzige Möglichkeit, den Standardwert zum "Aktivieren" zu erhalten, besteht darin , den OUTPUT
Parameter überhaupt nicht zu übergeben , was meiner Meinung nach wenig Sinn macht: Da er als OUTPUT
Parameter 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 !!)
NULL
Sie sich entscheiden,@AddressId
wenn eine Adresse nicht existiert, ohne einen Zweig zu verwenden?"