2016-09-18 3 views
0

У меня есть хранимая процедура, где он может обновить 4 столбца ниже, поскольку есть 4 параметра (1 параметр для каждого столбца с ClawbackID - единственный, который не изменение).Как установить NULL при вводе NULL сохраняет старое значение

Теперь нет фиксированного количества столбцов, которые можно обновить, я могу выбрать обновление 1 колонки или 3 столбца или всего 4 столбца. Поэтому, чтобы уменьшить человеческую ошибку, у меня есть коалесценция, так что если пользователь вводит «NULL» для определенного параметра во время выполнения процедуры, исходная сумма остается.

Пример для строки 3 для «ClawbackAmount», если я вхожу в NULL и выполняю, он все равно отобразит «ClawbackAmount» 900.54. Теперь проблема заключается в том, что на самом деле вы хотите установить эту сумму в «NULL», но я не хочу терять функциональность, если я набираю «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, если я хочу, чтобы внести изменения в:

Первый Param является ClawbackID (это не изменится, но это нужно знать, какая строка манипулировать.

Второй Param является PaymentID что NULL, как хотите, чтобы сохранить тот же

Третий Param является Clawbackdate что NULL, как хотите сохранить тот же

Четвертый Param является ClawbackPercent, который должен быть 0,25

Последний Param является ClawbackAmount, который мне нужно установить в NULL. Это int field btw, но оставляя его NULL, будет отображаться исходная сумма.

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

ответ

3

Обычно я использую какое-то определенное недопустимое значение в качестве индикатора, для столбца должно быть установлено значение NULL. В случае ClawbackPercent и ClawbackAmount -1 кажется хорошим кандидатом. Изменение будет выглядеть следующим образом:

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

Для строковых параметров, '' (пустая строка) может быть подходящим выбором.

+1

Coalesce _how_ NULL означает «Оставить как есть»; мое предложение поддерживает эту функциональность. – cco

+0

Использование Coalesce в качестве первого параметра в NullIf - это гений для достижения этого. Признайте, что для этого могут существовать требования к SQL Server и LINQ, чтобы они работали во всех ситуациях. (заметьте, я удалил предыдущий комментарий, который читал 180 градусов назад от того, что я имел в виду) –

+0

Большое спасибо – BruceyBandit

Смежные вопросы