输入NULL时如何设置NULL保留旧值

时间:2016-09-18 18:58:17

标签: sql sql-server

我有一个存储过程,它可以更新下面的4列,因为有4个参数(每列有1个参数,ClawbackID是唯一一个不会改变的参数)。

现在没有可以更新的固定数量的列,我可以选择更新1列,或3列或全部4列。因此,为了减少人为错误,我有一个合并,以便如果用户输入“空”'对于执行程序时的特定参数,原始金额保持不变。

' ClawbackAmount'的第3行示例,如果我输入NULL并执行,它仍然会显示' ClawbackAmount' 900.54。现在我遇到的问题是,实际上我想将此金额设置为“空白”,但我不想失去那些输入' NULL'执行我的程序时,它保留旧值。

我的问题是,有没有一种方法或一个想法,你可以想到我在哪里键入NULL然后默认值保持,但如果我键入类似''那么它将默认为' NULL'?

或者输入单词' SAME'保持默认值然后输入' NULL'为空值?只是想要真正解决它?

以下是我在参数中包含的代码,因为它们以@:

开头
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

如果我想进行所需的更改,下面是执行的代码作为第3行的示例:

First Param是ClawbackID(这不会改变,但需要知道要操作哪一行。

第二个参数是PaymentID,为了保持相同的

,它是NULL

第三个参数是Clawbackdate,它是NULL,因为想要保持相同

第四个参数是ClawbackPercent,需要为0.25

Last Param是ClawbackAmount,我需要设置为NULL。这是一个int字段btw,但保留NULL将保持显示的原始数量。

exec SupportAudit.BI.UpdateHotelClawback 28817, NULL, NULL, 0.25, NULL

1 个答案:

答案 0 :(得分:3)

我通常使用一些特定的无效值作为指示列应该设置为NULL。在ClawbackPercentClawbackAmount的情况下,-1似乎是一个很好的候选人。这种变化看起来像这样:

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

对于字符串参数,''(空字符串)可能是一个合适的选择。