2013-02-26 10 views
9

In base a un parametro, desidero eseguire un aggiornamento diverso nella procedura memorizzata. Ho provato molte permutazioni del codice qui sotto, ma ho sempre errori.caso nella stored procedure sql su SQL Server

@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' in SQL Server ** solo ** restituisce un singolo valore atomico: non è progettato per gestire espressioni o blocchi di codice (come' switch' in C#) –

+2

È possibile definire "errori", in particolare quando si utilizza La sintassi corretta di Michael? Quali errori? –

risposta

16

Prova questo

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

Chi mi ha votato, per favore pubblica il tuo motivo, non c'è errore di sintassi o qualcosa di sbagliato in questa risposta. –

+2

Non è bello. Avere un upvote – Alex

+4

Avere un altro upvote! la tua risposta mi ha aiutato le persone dovrebbero davvero pubblicare PERCHÉ fanno downvotare qualcosa se non è ovvio. – adam

15

CASE non viene utilizzato per il controllo del flusso ... per questo, si avrebbe bisogno di utilizzare IF ...

Ma, c'è una base di set- soluzione a questo problema invece dell'approccio procedurale:

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 

Si noti che il ELSE conserva il valore originale se non viene soddisfatta la condizione @NewStatus.

+0

Questo è il mio metodo preferito ... poiché l'ottimizzatore colpirà ogni opzione. Usando la struttura If (anche se facile da leggere e comprendere) l'ottimizzatore funzionerà solo contro la condizione soddisfatta (qualunque sia il ramo di "IF") quando viene eseguita la prima. Questo metodo aiuta anche il piano di esecuzione a essere più preciso. –

+0

è perfetto! grazie – colapiombo

Problemi correlati