2013-04-02 9 views

Odpowiedz

163

Dodaj WHERE klauzuli

UPDATE dbo.TestStudents 
SET  LASTNAME = CASE 
         WHEN LASTNAME = 'AAA' THEN 'BBB' 
         WHEN LASTNAME = 'CCC' THEN 'DDD' 
         WHEN LASTNAME = 'EEE' THEN 'FFF' 
         ELSE LASTNAME 
        END 
WHERE LASTNAME IN ('AAA', 'CCC', 'EEE') 
4

Jeśli nie chcesz, aby powtórzyć listę dwukrotnie (jak na @ odpowiedzią ŚJ), a następnie umieścić aktualizacje w zmiennej tabeli i użyć JOIN w UPDATE:

declare @ToDo table (FromName varchar(10), ToName varchar(10)) 
insert into @ToDo(FromName,ToName) values 
('AAA','BBB'), 
('CCC','DDD'), 
('EEE','FFF') 

update ts set LastName = ToName 
from dbo.TestStudents ts 
     inner join 
    @ToDo t 
     on 
     ts.LastName = t.FromName 
9

jest także alternatywny stosowanie przypadku-po ...

UPDATE [dbo].[JobTemplates] 
SET [CycleId] = 
    CASE [Id] 
     WHEN 1376 THEN 44 --ACE1 FX1 
     WHEN 1385 THEN 44 --ACE1 FX2 
     WHEN 1574 THEN 43 --ACE1 ELEM1 
     WHEN 1576 THEN 43 --ACE1 ELEM2 
     WHEN 1581 THEN 41 --ACE1 FS1 
     WHEN 1585 THEN 42 --ACE1 HS1 
     WHEN 1588 THEN 43 --ACE1 RS1 
     WHEN 1589 THEN 44 --ACE1 RM1 
     WHEN 1590 THEN 43 --ACE1 ELEM3 
     WHEN 1591 THEN 43 --ACE1 ELEM4 
     WHEN 1595 THEN 44 --ACE1 SSTn  
     ELSE 0 
    END 
WHERE 
    [Id] IN (1376,1385,1574,1576,1581,1585,1588,1589,1590,1591,1595) 

Podoba mi się korzystanie z tabel tymczasowych w przypadkach, gdy zduplikowane wartości są niedozwolone i twoja aktualizacja może je utworzyć. Na przykład:

SELECT 
    [Id] 
    ,[QueueId] 
    ,[BaseDimensionId] 
    ,[ElastomerTypeId] 
    ,CASE [CycleId] 
     WHEN 29 THEN 44 
     WHEN 30 THEN 43 
     WHEN 31 THEN 43 
     WHEN 101 THEN 41 
     WHEN 102 THEN 43 
     WHEN 116 THEN 42 
     WHEN 120 THEN 44 
     WHEN 127 THEN 44 
     WHEN 129 THEN 44 
     ELSE 0 
    END    AS [CycleId] 
INTO 
    ##ACE1_PQPANominals_1 
FROM 
    [dbo].[ProductionQueueProcessAutoclaveNominals] 
WHERE 
    [QueueId] = 3 
ORDER BY 
    [BaseDimensionId], [ElastomerTypeId], [Id]; 
---- (403 row(s) affected) 

UPDATE [dbo].[ProductionQueueProcessAutoclaveNominals] 
SET 
    [CycleId] = X.[CycleId] 
FROM 
    [dbo].[ProductionQueueProcessAutoclaveNominals] 
INNER JOIN 
(
    SELECT 
     MIN([Id]) AS [Id],[QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] 
    FROM 
     ##ACE1_PQPANominals_1 
    GROUP BY  
     [QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] 
) AS X 
ON 
    [dbo].[ProductionQueueProcessAutoclaveNominals].[Id] = X.[Id]; 
----(375 row(s) affected) 
-5
UPDATE myt SET ENO = 
CASE 
     WHEN ENO =1 THEN 10 
     WHEN ENO=0 THEN 100 
     END 
FROM MYT