我有一个存储过程,它可以更新下面的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
答案 0 :(得分:3)
我通常使用一些特定的无效值作为指示列应该设置为NULL。在ClawbackPercent
和ClawbackAmount
的情况下,-1似乎是一个很好的候选人。这种变化看起来像这样:
...
, clw.ClawbackPercent = NullIf(Coalesce(@ClawbackPercent, clw.ClawbackPercent), -1)
, clw.ClawbackAmount = NullIf(Coalesce(@ClawbackAmount,clw.ClawbackAmount), -1)
...
对于字符串参数,''
(空字符串)可能是一个合适的选择。