Поведение странного обновления - PullRequest
0 голосов
/ 13 мая 2009

В части моих хранимых процедур хранения данных у меня есть процедура, которая сравнивает старые данные проекта с новыми данными проекта (старые данные находятся в таблице, новые - во временной таблице) и обновляет старые данные.

Странная часть в том, что если старые данные имеют значение null, оператор update не работает. Если я добавлю нулевое утверждение, обновление работает нормально. Мой вопрос: почему это не работает так, как я думал?

Один из нескольких операторов обновления:

update cube.Projects
set prServiceLine=a.ServiceLine
from @projects1 a
    inner join cube.Projects
        on a.WPROJ_ID=cube.Projects.pk_prID
where prServiceLine<>a.ServiceLine

Ответы [ 3 ]

1 голос
/ 13 мая 2009
where prServiceLine<>a.ServiceLine

если prServiceLine равен нулю или a.ServiceLine равен нулю, то результатом условия является ноль, а не логическое значение

проверить это:

declare @x int, @y int
if @x<>@y print 'works'
if @x=@y print 'works!'
set @x=1
if @x<>@y print 'not yet'
if @x=@y print 'not yet!'
set @y=2
if @x<>@y print 'maybe'
if @x=@y print 'maybe!'

Выход:

maybe

вы никогда не увидите «работает», «работает!», «Еще нет» или «еще нет!» получить вывод. Только «Возможно» («возможно!», Если они оба были равны).

вы не можете проверить нулевые значения с помощью! =, = Или <>, вам нужно использовать ISNULL (), COALESCE, NOT NOT NULL или IS NULL в вашем WHERE, если одно из значений, которые вы тестируете, NULL.

1 голос
/ 13 мая 2009

Статья в Википедии о SQL Null на самом деле действительно хороша - она ​​объясняет, как часто поведение не соответствует ожидаемому, возвращая во многих случаях «неизвестное», а не истинное или ложное.

Если ввести нулевые значения, в этом есть немало проблем ...

0 голосов
/ 13 мая 2009

Возможно, вам нужно левое соединение (или право в зависимости от данных), а не внутреннее соединение.

...