2013-02-26 55 views
9

根據參數我想在存儲過程中執行不同的更新。我已經嘗試了以下代碼的許多排列,但我總是有錯誤。SQL Server上的SQL存儲過程中的大小寫

@EmpID int = 0, 
@NewStatus nvarchar(10) = 0 
AS 
BEGIN 
SET NOCOUNT ON; 

select CASE @NewStatus 

when 'InOffice' then 
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID 
when 'OutOffice' then 
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID 
when 'Home' then 
    Update tblEmployee set Home = -1 where EmpID = @EmpID 

END 
+1

只有SQL Server中的CASE **返回一個單一的原子值 - 它不是用來處理表達式或代碼塊的(如C#中的switch) – 2013-02-26 22:23:59

+2

您可以定義「錯誤」 - 特別是在使用Michael的正確語法?什麼錯誤? – 2013-02-27 00:16:38

回答

16

試試這個

If @NewStatus = 'InOffice' 
BEGIN 
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID 
END 
Else If @NewStatus = 'OutOffice' 
BEGIN 
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID 
END 
Else If @NewStatus = 'Home' 
BEGIN 
    Update tblEmployee set Home = -1 where EmpID = @EmpID 
END 
+3

誰投我票請張貼您的理由,沒有語法錯誤或任何錯誤的答案。 – 2013-02-27 04:38:01

+2

這並不酷。有一個upvote。 – Alex 2013-08-14 18:15:41

+4

再來一次!你的回答幫助了我。人們應該真的發佈,如果它不明顯,他們爲什麼downvote。 – adam 2014-07-11 12:50:08

15

CASE不用於流量控制...對於這一點,你需要使用IF ...

但是,有一個基於集合的解決此問題而不是程序方法:

UPDATE tblEmployee 
SET 
    InOffice = CASE WHEN @NewStatus = 'InOffice' THEN -1 ELSE InOffice END, 
    OutOffice = CASE WHEN @NewStatus = 'OutOffice' THEN -1 ELSE OutOffice END, 
    Home = CASE WHEN @NewStatus = 'Home' THEN -1 ELSE Home END 
WHERE EmpID = @EmpID 

請注意,如果@NewStatus條件未得到滿足,將保留原始值。

+0

這恰好是我的首選方法...因爲優化器會觸及每個選項。使用If結構(儘管易於閱讀和理解),優化器只會在第一次執行時針對滿足的條件('IF'的任何分支)工作。這種方法也有助於執行計劃更加準確。 – 2016-03-16 14:02:09

+0

它是完美的!謝謝 – colapiombo 2017-05-20 12:50:34