Ho una tabella:T-SQL UPDATE condizionale (v2)
Message (MessageID int, Subject nvarchar(100), Body nvarchar(max))
Dopo che un messaggio è in fase di aggiornamento sulla UI, che io chiamo un proc memorizzato per aggiornare quel tavolo. In alcuni casi l'utente può aggiornare solo il soggetto, in altri casi solo il corpo. Voglio che questo proc memorizzato per aggiornare solo ciò che è cambiato, quindi sto passando anche bandiere che mostrano se nell'oggetto o nel corpo è stato aggiornato:
create proc UpdateMessage(
@MessageID int,
@Subject nvarchar(100),
@Body nvarchar(max),
@SubjectChanged bit,
@BodyChanged bit)
e ora sono confuso come costruire il condizionale UPDATE
dichiarazione. Il mio primo pensiero è stato quello di utilizzare CASE
:
Update [Message]
SET
CASE WHEN @SubjectChanged = 1 THEN [Subject] = @Subject ELSE 1=1 END,
CASE WHEN @BodyChanged = 1 THEN Body = @Body ELSE 1=1 END,
WHERE MessageID = @MessageID
... ma questo non sembra essere una sintassi corretta come CASE
deve essere sul lato destro di un assigment.
Qualche idea su come potrei farlo? (E tieni presente che in realtà ci sono 6 parametri che possono essere aggiornati, non due)
Ricordare che il corpo del messaggio può essere 5-10-50kb e se un utente ha appena aggiornato l'oggetto, è estremamente dispendioso rimandare il corpo del messaggio e anche eseguire l'aggiornamento di quel campo al db quando non è necessario. Il sito web è pesantemente carico, quindi ho bisogno di assicurarmi di ottimizzare dove possibile. – Andrey
Perché non utilizzare semplicemente stored procedure separate? Ha davvero bisogno di essere racchiuso in un singolo sproc? Probabilmente vorrai apportare alcune modifiche in futuro che rovineranno completamente il tuo "piano fantastico" –
"Perché non usare solo stored procedure separate allora?" - per salvare su più chiamate db – Andrey