我有一个执行简单更新的存储过程(见下文)。
我只想更新传递的字段,而不是那些为空的字段。也就是说,如果我没有得到某个参数的值,我不想将表数据更新为 null,而只是保留当前值。
这可以在这样的 sql update 语句中完成吗?
ALTER PROCEDURE [dbo].[upd_MessageDetail]
@MessageId INT,
@IsDraft INT,
@IsPreviewed INT,
@IsRead INT,
@IsFlagged INT,
@IsDeleted INT,
@IsArchived INT
AS
BEGIN
UPDATE MessageDetail
SET
IsDraft = @IsDraft,
IsPreviewed = @IsPreviewed,
IsRead = @IsRead,
IsFlagged = @IsFlagged,
IsDeleted = @IsDeleted,
IsArchived = @IsArchived
WHERE MessageId = @MessageId
如果我理解正确,如下所示。
Sankar Reddy的答案的附录是,如果您使用复制或使用检查列是否已更新的触发器(使用Update()函数),那么创建一个复杂的 IF .. ELSE 语句以不包括UPDATE 语句中的字段。
具体来自MSDN 文章
选项:
检查所有可能的更新组合(这样您只需使用最少的网络带宽对数据库进行一次更新调用)
通过单独更新每一列来允许多次更新调用...
将更新语句解析为一个大字符串,然后执行它
推荐