Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不包括更新SQL Server 2008中的行_Sql_Sql Server 2008 - Fatal编程技术网

不包括更新SQL Server 2008中的行

不包括更新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语句,而是必须指定要更改的行以及修改它们的值。简而言之,我想根据相应的参数ID更新一列当前为空的日期;因此,以下陈述似乎合乎逻辑:

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再次尝试了这个方法,它将更新的行限制在我想要的范围内。谢谢你的解决方案。