2012-04-24 5 views
3

Я пытаюсь обновить определенный набор строк с конкретной информацией. Это означает, что я не могу выполнить простой оператор обновления, но вместо этого нужно будет указать строки, которые я хочу изменить, и значения, по которым я буду их исправлять. Короче говоря, я хочу обновить столбец дат, которые в настоящее время не соответствуют соответствующему параметру; Следующее утверждение, таким образом, кажется логичным:Исключение строк в обновлении SQL Server 2008

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 

Если я затем обновить все строки, которые не включены в этот список, то есть все строки, где parameterids не являются «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, и я уверен, что я где-то не вижу ключевого элемента. Не могли бы вы помочь?

ответ

1

Это следует сделать это:

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 
+0

Благодарим вас за ответ. Это похоже на мое второе решение, которое приводит к обновлению всех строк. Вы знаете, почему это было бы? – user1353787

+0

Я пробовал это снова с использованием дополнительного параметра - cp.parametercategory, который ограничивает обновляемые строки тем, что я хочу. Спасибо за ваше решение. – user1353787

1

Два способа сделать это,

# 1, указать пункт 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, используйте ИНЕКЕ, чтобы соответствовать только те строки, которые также имеют матч в этом выражении случай:

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') 

Второй, как правило, быстрее и предпочтительнее по соображениям блокировки.

+0

Спасибо за ваш ответ. Однако при выполнении первого решения он приводит к обновлению ВСЕХ строк. При использовании второго решения я получаю следующее сообщение «Msg 241, Level 16, State 1, Line 1 Conversion не удалось при преобразовании даты и/или времени из символьной строки». – user1353787

+0

Извините, второй запрос исправлен. И да, первый запрос обновляет те же строки, что и исходный запрос, но не пустые несоответствующие. – RBarryYoung