2012-10-27 68 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')