2012-10-27 70 views
2

我有一个表学生有两个字段,StudentName和Grade。 我正在尝试编写一个存储过程来更新成绩。如果学生有一个A,我想把它改为B.如果他们有一个B,我想把它改成A.如果他们还有其他东西,我想让它独立。这是我最好的尝试SQL使用存储过程中的if语句更新表

create procedure sp_changegrades 
if Grade = 'A' update Students set Grade = 'B' 

else if Grade = 'B' update Students set Grade = 'A' 

回答

5

只使用CASE

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' THEN 'B' 
     WHEN Grade = 'B' THEN 'A' 
     ELSE Grade  -- "If they have anything else I want to leave it alone." 
    END 
) 

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' 
     THEN 'B' 
     ELSE 'A' 
    END 
) 
WHERE Grade IN ('A','B') 
+1

你也许可以通过添加where子句,其中甲级(“A”,“B”) –

0

你可以写水木清华这样的。在此解决方案中,您可以定义join部分中的更新规则,然后进行更新。

create procedure sp_changegrades 
as 
begin 
    update Students set 
     Grade = G.Grade_New 
    from Students as S 
     inner join (values 
      ('A', 'B'), 
      ('B', 'A') 
     ) as G(Grade_Old, Grade_New) on G.Grade_Old = S.Grade 
end 

,或者您可以使用case

create procedure sp_changegrades 
as 
begin 
    update Students set 
     Grade = 
      case Grade 
       when 'A' then 'B' 
       when 'B' then 'A' 
       else Grade 
      end 
end 
+1

第一个查询应读作更新S设定......从学生的内心加盟这里补充效率。 ..'或'update学生设置...从学生内部连接...'第二个查询看起来像是Woo的答案副本。 – Andomar

+0

@Andomar你对'update s'不正确,查询是正确的。第二个看起来和John差不多,因为它很明显的解决方案:)我更喜欢'join'解决方案,因为它给了我更多的自由度,例如,我可以按照相同的规则更新两个字段。 –

+0

第一个查询“起作用”,因为'from'子句中只有一个对学生的引用。在这种情况下,SQL Server允许你使用表名和别名。使用这种特殊的技巧会使你的代码难以阅读。 – Andomar

0

您可以利用Case语句,并添加where子句,所以你只更新初步认识行。

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' THEN 'B' 
     WHEN Grade = 'B' THEN 'A' 
     ELSE Grade  -- "Included for Completeness, should never be utilized." 
    END 
) 
WHERE Grade in ('A','B')