Tôi có một bảng:T-SQL UPDATE có điều kiện (v2)
Message (MessageID int, Subject nvarchar(100), Body nvarchar(max))
Sau một tin nhắn đang được cập nhật trên giao diện người dùng, tôi gọi một proc lưu trữ để cập nhật bảng đó. Trong một số trường hợp, người dùng có thể cập nhật chỉ chủ đề, trong các trường hợp khác chỉ là nội dung. Tôi muốn proc lưu trữ này để chỉ cập nhật những gì đã thay đổi, vì vậy tôi cũng đang đi cờ cho thấy cho dù chủ đề hoặc cơ thể đã được cập nhật:
create proc UpdateMessage(
@MessageID int,
@Subject nvarchar(100),
@Body nvarchar(max),
@SubjectChanged bit,
@BodyChanged bit)
Và bây giờ tôi đang bối rối như thế nào để xây dựng UPDATE
tuyên bố có điều kiện. Suy nghĩ đầu tiên của tôi là sử dụng 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
... nhưng điều đó dường như không phải là một cú pháp đúng như CASE
phải là phía bên phải của một assigment.
Bất kỳ ý tưởng nào về cách tôi có thể làm điều đó? (Và hãy nhớ rằng trong thực tế có 6 thông số có thể được cập nhật, không phải là hai)
Xin lưu ý rằng nội dung thư có thể là 5-10-50kb và nếu người dùng vừa cập nhật chủ đề, sẽ vô cùng lãng phí khi gửi nội dung thư và cũng thực hiện cập nhật của trường đó cho db khi không cần thiết. Trang web tải nặng nên tôi cần đảm bảo tối ưu hóa khi có thể. – Andrey
Tại sao không chỉ sử dụng các thủ tục lưu trữ riêng biệt? Liệu nó thực sự cần phải được bao hàm trong một sproc duy nhất? Có thể bạn sẽ muốn thực hiện một số sửa đổi trong tương lai sẽ hủy hoại hoàn toàn "kế hoạch tuyệt vời" –
"Tại sao không chỉ sử dụng các thủ tục được lưu trữ riêng biệt?" - để lưu vào nhiều cuộc gọi db – Andrey