2016-09-18 2 views
0

Ich habe eine gespeicherte Prozedur, wo es die 4 Spalten unten aktualisieren kann, da es 4 Parameter gibt (1 Parameter für jede Spalte mit ClawbackID die einzige, die das nicht tut Veränderung).Wie man NULL setzt, wenn NULL eingegeben wird, behält den alten Wert bei

Jetzt gibt es keine feste Anzahl von Spalten, die aktualisiert werden können, ich kann wählen, 1 Spalte oder 3 Spalten oder alle 4 Spalten zu aktualisieren. Um menschliche Fehler zu reduzieren, habe ich eine Koaleszenz, so dass, wenn der Benutzer während der Ausführung eines Verfahrens 'NULL' für einen bestimmten Parameter eingibt, der ursprüngliche Betrag erhalten bleibt.

Beispiel für Zeile 3 für 'ClawbackAmount', wenn ich NULL eingeben und ausführen, wird immer noch 'ClawbackAmount' 900.54 angezeigt. Das Problem, das ich habe, ist, dass ich diesen Betrag auf 'NULL' setzen möchte, aber ich möchte nicht die Funktionalität verlieren, wenn ich bei der Ausführung meiner Prozedur 'NULL' eintippe, dass es den alten Wert behält.

Meine Frage ist, dass es einen Weg oder eine Idee gibt, an die ich denke, wo ich NULL eintippe, dann bleiben die Standardwerte, aber wenn ich etwas wie "" eintippe, wird es standardmäßig auf "NULL"?

Oder geben Sie alternativ das Wort 'SAME' ein, um den Standardwert beizubehalten, und geben Sie dann 'NULL' für einen Nullwert ein? Nur Ideen wirklich um es zu umgehen?

Unten ist der Code, den ich mit den Parametern haben berücksichtigt, da sie mit @ beginnen:

update clw 
set clw.PaymentID = Coalesce(@PaymentID, clw.PaymentId) 
,clw.ClawbackDate = Coalesce(@ClawbackDate, clw.ClawbackDate) 
, clw.ClawbackPercent = Coalesce(@ClawbackPercent, clw.ClawbackPercent) 
, clw.ClawbackAmount = Coalesce(@ClawbackAmount,clw.ClawbackAmount) 
OUTPUT '[Fees].EBD.Clawback' 'TableName','ClawbackId', inserted.ClawbackId, 
Core.updXMLFragment('PaymentId', inserted.PaymentId, deleted.PaymentId) + 
Core.updXMLFragment('ClawbackDate', Convert(varchar(50),inserted.ClawbackDate, 112), Convert(varchar(50),deleted.ClawbackDate, 112)) + 
Core.updXMLFragment('ClawbackPercent', inserted.ClawbackPercent, deleted.ClawbackPercent) + 
Core.updXMLFragment('ClawbackAmount', inserted.ClawbackAmount, deleted.ClawbackAmount) 

    INTO @OutputList 
from [Fees].EBD.Clawback clw 
Where 
ClawbackId = @ClawbackID 

Unterhalb der Code für die Ausführung als ein Beispiel ist für Zeile 3, wenn ich will die gewünschte Änderung vornehmen:

Erste Param ClawbackID ist (dies ändert sich nicht, aber muss es wissen, welche Zeile zu manipulieren.

Zweite Param ist PaymentID, die NULL ist als die gleiche

behalten möchten

Dritte Param ist Clawbackdate, die NULL ist als die gleiche

Vierte Param ClawbackPercent behalten wollen, die 0,25

Last Param ist ClawbackAmount sein muss, die ich auf NULL einstellen müssen. Dies ist ein int-Feld btw, aber wenn Sie NULL belassen, wird der ursprüngliche Wert angezeigt.

Antwort

3

Ich verwende normalerweise einen bestimmten ungültigen Wert als Indikator, die Spalte sollte auf NULL gesetzt werden. Im Fall von ClawbackPercent und ClawbackAmount scheint -1 ein guter Kandidat zu sein. Die Änderung würde wie folgt aussehen:

... 
, clw.ClawbackPercent = NullIf(Coalesce(@ClawbackPercent, clw.ClawbackPercent), -1) 
, clw.ClawbackAmount = NullIf(Coalesce(@ClawbackAmount,clw.ClawbackAmount), -1) 
... 

Bei String-Parameter, '' (leerer String) könnte eine geeignete Wahl sein.

+1

Coalesce ist _how_ NULL bedeutet "Leave as is"; Mein Vorschlag behält diese Funktionalität bei. – cco

+0

Verwenden von Coalesce als der erste Parameter in einem NullIf ist genial um dies zu erreichen. Beachten Sie, dass SQL Server- und LINQ-Versionsanforderungen für das Funktionieren in allen Situationen gelten können. (Beachten Sie, dass ich einen früheren Kommentar gelöscht habe, der um 180 Grad rückwärts von dem gelesen wurde, was ich meinte) –

+0

Vielen Dank – BruceyBandit

Verwandte Themen