不包括更新SQL Server 2008中的行
我正在尝试使用特定信息更新某些选定的行。这意味着我不能执行简单的update语句,而是必须指定要更改的行以及修改它们的值。简而言之,我想根据相应的参数ID更新一列当前为空的日期;因此,以下陈述似乎合乎逻辑:不包括更新SQL Server 2008中的行,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试使用特定信息更新某些选定的行。这意味着我不能执行简单的update语句,而是必须指定要更改的行以及修改它们的值。简而言之,我想根据相应的参数ID更新一列当前为空的日期;因此,以下陈述似乎合乎逻辑: UPDATE contactparameter SET effectiveto = CASE parameterid When '2887' Then '13-Aug-2012' When '2896' Then '21-Feb-2012' When '3008' Th
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
如果随后更新,则不包括在此列表中的所有行,即参数不是“2887”、“2896”、“3008”或“3272”的所有行,都将清空。我已尝试在子查询中选择要更新的行:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
WHERE exists
(SELECT cp.parameterid
from contact c
INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber
WHERE cp.effectivefrom is not null
and cp.effectiveto is null)
但这完全是一样的。我在使用SQL方面仍然相当缺乏经验,我确信我在某个地方遗漏了一个关键元素。您能帮忙吗?这应该可以:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
from contact c
INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber
WHERE cp.effectivefrom is not null
and cp.effectiveto is null
有两种方法可以做到这一点
#1,在CASE表达式中指定一个ELSE子句,以仅返回它已经具有的相同值,因为否则它将对所有非匹配项返回NULL:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
Else effectiveto
END
或者,#2,使用WHERE子句仅匹配在大小写表达式中也有匹配项的行:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
WHERE parameterid IN('2887','2896','3008','3272')
由于锁定原因,第二个通常更快,更受欢迎。谢谢您的回复。但是,在执行第一个解决方案时,会更新所有行。使用第二个解决方案时,我收到以下消息“Msg 241,级别16,状态1,从字符串转换日期和/或时间时第1行转换失败”。抱歉,第二个查询已修复。是的,第一个查询会更新与原始查询相同的行,但不会将不匹配的行清空。谢谢您的回复。这似乎与我的第二个解决方案相同,它会更新所有行。你知道为什么会这样吗?我已经用一个额外的参数-cp.parametercategory再次尝试了这个方法,它将更新的行限制在我想要的范围内。谢谢你的解决方案。