奇怪的更新行为

时间:2009-05-13 14:01:46

标签: sql-server sql-server-2005 data-warehouse

在我的数据仓库存储过程的一部分中,我有一个过程将旧项目数据与新项目数据进行比较(旧数据在表中,临时表中是新数据)并更新旧数据。

奇怪的是,如果旧数据为null,则update语句不起作用。如果我添加一个is null语句,更新工作正常。我的问题是,为什么这不像我想的那样工作?

多个更新语句之一:

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 个答案:

答案 0 :(得分:1)

where prServiceLine<>a.ServiceLine

如果prServiceLine为null或a.ServiceLine为null,则条件的结果为null而不是布尔值

测试一下:

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

你永远不会看到“作品”,“作品!”,“还没有”,或“还没有!”得到输出。只有Maybe('也许!',如果它们都相等)。

您无法使用!=,=或&lt;&gt;测试空值,如果您正在测试其中一个值,则需要在WHERE中使用ISNULL(),COALESCE,IS NOT NULL或IS NULL可以是NULL。

答案 1 :(得分:1)

关于SQL Nulls的维基百科文章实际上非常好 - 它解释了行为往往不是你所期望的,在许多情况下返回“未知”而不是真或假。

如果引入空值,会涉及很多问题......

答案 2 :(得分:0)

也许您需要LEFT JOIN(或RIGHT取决于数据)而不是INNER JOIN。