我有一张表:
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个参数可以更新,而不是两个)
创建语句所需的语法为:
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。
问题内容: 在此找到了两个类似的问题,但无法弄清楚如何应用于我的方案。 我的函数有一个名为 @IncludeBelow 的参数。值是0或1(BIT)。 我有这个查询: 如果@IncludeBelow为0,我需要查询如下: 如果@IncludeBelow为1,则最后一行需要排除。(即不应用过滤器)。 我猜想它必须是一条语句,但无法弄清楚语法。 这是我尝试过的: 显然,这是不正确的。 正确的语法是什么
问题内容: 我想在日期基础上更新一行。问题是,由于我的错误,我有两行相同的数据。如何仅在一行上运行更新? 问题答案: 表通常具有唯一的ID。您应该对此进行过滤。 例如, 如果您的表没有唯一的ID,请考虑添加一个:带有和的列。
问题内容: 考虑到TimeExited为null,并且计算机名与“ cm”参数相同,我试图更新表Log(具有最新TimeAccessed的字段)的最后一条记录。我有这个但得到错误,“在SQL语句末尾缺少分号” 怎么了?? 前两行没什么问题,可以正常工作,这是最后两行带来的问题 问题答案: Access SQL不会使用它使用use ,并且正如在问题注释中引用的另一个问题中所提到的那样,不允许您按照所
问题内容: 拥有5列地址数据。我需要将这些字段连接到一个地址中,如果它们之间存在空格,则它们之间应有空格。如果该列的值为空,则应跳过该列,不要输入任何空格。 我想做的是有一个变量,并将其分配给第一列street_number的值,然后当我移至下一列street_ext时,如果它不为null,我想检查一下是否该变量为null,如果不是,则在其后附加一个空格和值…以此类推。 我很生疏,可能会朝正确的方
问题内容: 问题: 将变量(或列)的值限制为数字和ASCI字符,但允许变量长度。 该脚本不会产生所需的结果: 有人知道该怎么做吗? 问题答案: 您可以使用not克拉^和一个NOT LIKE表达式来执行此操作。 因此,您说,这里不像非字母数字;)这适用于标准数字和字符: 编辑:感谢Martin的排序规则提示,如果您希望像媒体这样的字符被视为非字母数字,请在COLLATE中添加如下
问题内容: 我想使用此查询中的值进行更新,但这意味着它返回多个值。 消息512,级别16,状态1,行1 子查询返回的值大于1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。 它如何返回不止一列? 问题答案: 如果此查询返回所需的信息: 然后,这可能是您想要的UPDATE查询: 我必须同意戈登的观点,您的分组似乎很奇怪。我不确定我是否正确(这就是为什么我强烈建议您先