我有以下查询:
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
答案 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