Übergeben des Standardparameterwertes vs nicht übergebender Parameter überhaupt?

Hier ist was ich tun möchte:

Angesichts einer Tabelle

PeopleOutfit (id int primary key, boots int, hat int) 

Und eine gespeicherte Prozedur

 UpdateOutfit @id int, @newBoots int = null, @newHat = null 

Gibt es eine Möglichkeit zu sagen, ob ich dieses Verfahren als genannt

 exec UpdateOutfit @id=1, @newBoots=null, @newHat=5 

effektiv zu sagen, dass die Person mit id von 1 muss jetzt barfuß und tragen fünfte Hut aus

 exec UpdateOutfit @id=1, @newHat=5 

das beauftragt diese Person, den fünften Hut zu tragen, der seine aktuellen Stiefel hält

Mit anderen Worten, ich möchte erzählen (innerhalb der gespeicherten Prozedur), wenn "der Standardwert verwendet wurde, weil es nicht angegeben wurde" aus "Ich explizit diese Prozedur angerufen, die den Wert übergibt, der random derselbe wie der Standard ist".

Ich weiß, es gibt mehrere Möglichkeiten zu erreichen, was ich tun möchte, wie das Übergeben von XML oder Bitmaske von Feldern aktualisiert werden, aber für den Moment möchte ich nur sicherstellen, ob diese genaue Technik möglich ist oder nicht.

Bearbeiten: Übergeben von reservierten Werten funktioniert nicht für Felder mit kleinen Bereichstypen wie Bit. Überladungsverfahren ist auch eine Option, die nicht akzeptabel ist. Das Erstellen eines benutzerdefinierten Typs, der das NULL-Paradigma mit zusätzlichem "NotAValue" -Wert verlängert, könnte eine Antwort sein, aber ich brauche eine weitere Anleitung, wie man es implementiert.

   

Meine Vermutung ist nein, man kann diese beiden Dinge nicht auseinander halten.

Mein Vorschlag ist, einen Standardwert zu verwenden, den du nie als Argument weitergeben würdest. dh wenn die Voreinstellung null , dann könnten Sie in 0 als den Wert für @newBoots

Nein, die Standard-Null "sieht" genauso aus wie eine in null übergebene

Möglicherweise machen Sie Ihre Standard-1 und verwenden Sie die Logik, um etwas anderes zu tun.

Streng, nein, es gibt keine wirkliche Möglichkeit, dies zu erreichen. Sie könnten jedoch versuchen, eine Art von reservierten Wert für den Parameter (eine sehr kleine negative Zahl, zum Beispiel), um dies anzuzeigen.

Mach das niemals selbst; stellte das 3-State-Bit (mit einem Integer) in einen Code ein, um die Bit-Situation zu behandeln. Ich habe keinen Zugang zu einem SQL server, aber ich mag das letztere Denken manchmal? aber ich denke, Sie könnten in der Lage sein, um herauszufinden, ysubg eine String Manipulation über einige Management-viewen / functionen. Sie müssten mit einem Heck von viel Privileg laufen, aber wenn seine absolut notwendig, ich don, t sehen, warum Sie es nicht aus st.text verwenden können, mit so etwas wie dies

 SELECT st.text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st WHERE r.session_id = @@SPID 

Wie gesagt, TSQL unterscheidet nicht zwischen der Bereitstellung des Default-Wertes und nicht die Bereitstellung eines Wertes. Ich denke, der Motor ersetzt im Grunde die Standardwerte für alle fehlenden Parameter (oder Params, die mit dem Schlüsselwort DEFAULT aufgerufen werden).

Verwenden Sie stattdessen 0 als "No Hat" und NULL als kein Parameter angegeben. Dies ist die bevorzugte Verwendung von NULL, wo es bedeutet Wert unbekannt oder nicht spezifiziert. Durch die Verwendung von NULL als "No Hat" haben Sie sich dazu entschlossen, dem Bereich Ihres datatyps einen zusätzlichen Wert hinzuzufügen.

Denken Sie an es in Bezug auf den BIT-datatyp. Der datatyp ist definiert, um einen binären Wert darzustellen (1 oder 0 oder T / F, wenn Sie es vorziehen, es als boolesch zu denken.) Wenn Sie NULL als gültigen Wert behandeln, haben Sie den datatyp über die Binäroptionen hinaus erweitert (jetzt haben drei Optionen, 1/0 / NULL.) Meine Empfehlung ist immer, dass, wenn Sie feststellen, dass Sie aus den Werten im aktuellen datatyp laufen, verwenden Sie einen zu kleinen Typ.

Zurück zum gespeicherten Prozeduraufruf; Wenn Sie Ihre Standardwerte auf NULL setzen und NULL als unset oder nicht spezifiziert behandeln, sollten Anrufer beim Aufruf des Proc immer einen Nicht-Nullwert angeben. Wenn Sie einen NULL bekommen, nehmen Sie an, dass sie keinen Wert geliefert haben, einen NULL geliefert oder das DEFAULT-Schlüsselwort verwendet haben.