一尘不染

T-SQL条件更新(v2)

sql

我有一张表:

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 [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个参数可以更新,而不是两个)


阅读 197

收藏
2021-03-10

共1个答案

一尘不染

创建语句所需的语法为:

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。

2021-03-10