我有一张表:
Message (MessageID int, Subject nvarchar(100), Body nvarchar(max))
在UI上更新消息后,我调用存储的proc来更新该表。在某些情况下,用户可能仅更新主题,而在其他情况下,仅更新正文。我希望此存储的过程仅更新已更改的内容,因此我还传递了一些标志,用于显示主题或正文是否已更新:
create proc UpdateMessage( @MessageID int, @Subject nvarchar(100), @Body nvarchar(max), @SubjectChanged bit, @BodyChanged bit)
现在我很困惑如何构建条件UPDATE语句。我的第一个想法是使用CASE:
UPDATE
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
…但这似乎不是正确的语法,因为CASE它必须是分配的右侧。
有什么想法可以做到吗?(请记住,实际上有6个参数可以更新,而不是两个)
创建语句所需的语法为:
Update [Message] SET [Subject] = CASE WHEN @SubjectChanged = 1 THEN @Subject ELSE [Subject] END, Body = CASE WHEN @BodyChanged = 1 THEN @Body ELSE Body END WHERE MessageID = @MessageID
如果您仍然想在所有建议后坚持下去。
Nb如果您省略了CASE语句的ELSE [Subject]部分,则将字段设置为NULL,而不是忽略UPDATE。