SQL比较正在更新的字段

时间:2011-10-21 09:40:41

标签: sql sql-server sql-server-2008 sql-update case

我有以下查询:

UPDATE #Temp_SessionItem SET [Status] = 
    CASE
        WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL) AND [Status] = 1
            THEN 3
        WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL AND [Status] = 1
            THEN 2
    END

问题在于,当它被执行时,它实际上并没有给我我期望的结果。即,如果[Status]或[AddressFK]为StatusFK,则不会将[NULL]字段的值设置为3。相反,它只是在添加3时尝试将NULL添加到状态。

如果我删除表达式的AND [Status] = 1部分,它会返回3,但它会更新非[Status] = 1的值。

我有什么明显的遗失吗?

我正在使用SQL Server 2008。

修改

在Royi Namir向我指出之后,我意识到问题必须在执行此查询的存储过程中更进一步。具体来说,#Temp_SessionItem只是一个临时表。在上面提到的查询后,我正在尝试使用以下查询更新原始表:

--  update the status of the original session item table
    UPDATE UploadSessionItem SET [Status] = T.[Status]
    FROM #Temp_SessionItem AS T
    WHERE UploadSessionItem.UploadSessionItemId  = T.ID

..这显然不起作用,因为所有[Status]项仍有1

3 个答案:

答案 0 :(得分:2)

@bojanskr,两者都是[AddressFK]& [StatusFK]不为空,或者您的状态!= 1

更新前状态的价值是多少?他是什么样的人?

粘贴此查询的结果:

  select case when [AddressFK] IS NULL then 'AddressFKnull' else 'AddressFKNOTnull' end,
    case when [StatusFK] IS NULL then 'StatusFKnull' else 'StatusFKNOTnull' end , Status
    from  #Temp_SessionItem

答案 1 :(得分:2)

如果您只想影响当前STATUS 1的行,则需要WHERE子句:

UPDATE #Temp_SessionItem SET [Status] = 
    CASE
        WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
            THEN 3
        WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL
            THEN 2
    END
WHERE [Status] = 1

您展示的更新效果很好:

create table UploadSessionItem(UploadSessionItemID int,Status int)
insert into UploadSessionItem
select 1,1 union all select 2,2
create table #Temp_SessionItem (ID int,Status int)
insert into #Temp_SessionItem select 1,4
--Your UPDATE:
UPDATE UploadSessionItem SET [Status] = T.[Status]
    FROM #Temp_SessionItem AS T
    WHERE UploadSessionItem.UploadSessionItemId  = T.ID
--
select * from UploadSessionItem

结果:

UploadSessionItemID Status
1                   4
2                   2

因此,如果问题 在其他地方,那么它不在您向我们展示过的代码示例中。

答案 2 :(得分:1)

您没有默认情况,因此当这两个条件都不为真时,您将获得NULL。你可以像这样重写它:

UPDATE #Temp_SessionItem SET [Status] = 
  CASE
    WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
        THEN 3
    ELSE 2
  END
WHERE [Status] = 1