2013-02-26 7 views
9

Na podstawie parametru Chciałbym wykonać inną aktualizację w mojej procedura przechowywana. Próbowałem wielu permutacji kodu poniżej, ale zawsze mam błędy.case w sql procedura przechowywana na serwerze 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

'CASE' w SQL Server ** only ** zwraca pojedynczą, atomową wartość - nie jest przeznaczony do obsługi wyrażeń lub bloków kodu (np.' Switch' w języku C#) –

+2

Czy potrafisz zdefiniować "błędy" - w szczególności podczas używania Prawidłowa składnia Michaela? Jakie błędy? –

Odpowiedz

16

Spróbuj

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

Kto mnie głosował, proszę zaksięgować przyczynę, w tej odpowiedzi nie ma błędu składni ani niczego złego. –

+2

To nie jest fajne. Mieć uprowadzenie. – Alex

+4

Mieć kolejną przegrodę! Twoja odpowiedź mi pomogła. ludzie powinni naprawdę pisać DLACZEGO cisną coś, jeśli nie jest to oczywiste. – adam

15

CASE nie służy do sterowania przepływem ... do tego trzeba by użyć IF ...

Ale tam jest oparty set- rozwiązanie tego problemu zamiast podejścia proceduralnego:

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 

Zauważ, że ELSE zachowa oryginalną wartość, jeśli warunek @NewStatus nie zostanie spełniony.

+0

Tak się składa, że ​​jest to moja preferowana metoda ... ponieważ optymalizator trafi w każdą opcję. Korzystanie z If Structure (choć łatwe do odczytania i zrozumienia) optymalizator działa tylko w przypadku spełnienia warunku (bez względu na gałąź "IF") po pierwszym uruchomieniu. Ta metoda pomaga również w planie wykonania. –

+0

jest idealny! Dziękuję Ci – colapiombo

Powiązane problemy