0

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

奇怪的是,如果旧数据为空,则更新语句不起作用。如果我添加一个 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
4

3 回答 3

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('也许!',如果他们都是平等的)。

您不能使用 !=、= 或 <> 测试空值,如果您要测试的值之一可以为 NULL,则需要在 WHERE 中使用 ISNULL()、COALESCE、IS NOT NULL 或 IS NULL。

于 2009-05-13T14:09:03.317 回答
1

关于SQL Nulls的 Wikipedia 文章实际上非常好 - 它解释了行为通常不是您所期望的,在许多情况下返回“未知”而不是 true 或 false。

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

于 2009-05-13T14:31:37.650 回答
0

也许您需要左连接(或右连接,具体取决于数据)而不是内部连接。

于 2009-05-13T14:04:56.147 回答