В 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 равно null и src.C = 0, обновление не будет выполнено. Независимо от того, какое заменимое значение я выбираю, у меня будет эта проблема.
Я также попробовал синтаксис "AND NOT (... true...)", поскольку BOL заявляет, что оценки против нулевого результата в FALSE. Однако кажется, что они фактически приводят к NULL и не приводят к тому, что мой оператор нескольких частей становится ложным.
Я думал, что одним из решений является использование NaN или -INF или + INF, поскольку они недействительны в целевом. Но я не могу найти способ выразить это в SQL.
Есть идеи, как это решить?
EDIT:
Следующая логика решает проблему, но она многословна и не будет выполнять быстрые оценки:
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';