В SQL Server 2008 я использую MERGE.Все хорошо, за исключением того, что у меня есть 2 обнуляемых столбца.Если я передаю нулевое значение, а цель не равна нулю, MERGE не видит разницы (показывает против null = false за BOL ).Если я использую IsNull с обеих сторон (источник и цель), это работает, но при этом возникает проблема возможной неправильной оценки значения.
Что я имею в виду под последним утверждением, если я скажу:
WHEN MATCHED AND NOT (IsNull(tgt.C, 0) = IsNull(src.C, 0)) THEN
тогда, если tgt.C равно нулю и src.C = 0, обновление не будет выполнено.Независимо от того, какое значение замещения я выберу, у меня возникнет эта проблема.
Я также пробовал синтаксис "И НЕ (... истина ...)", поскольку BOL утверждает, что вычисления с нулевым результатом приводят к FALSE.Тем не менее, кажется, что они действительно приводят к NULL и не приводят к тому, что мой оператор из нескольких частей становится ложным.
Я думал, что одним из решений является использование NaN или -INF или + INF, поскольку они недопустимы в target.Но я не могу найти способ выразить это в SQL.
Есть идеи, как это решить?
РЕДАКТИРОВАТЬ:
Следующая логика решает проблему, ноэто многословно и не поможет быстро ускользнуть:
declare @i int, @j int
set @j = 0
set @i = 0
if ISNULL(@i, 0) != ISNULL(@j, 0) OR
((@i is null or @j is null) and not (@i is null and @j is null))
print 'update';