使用当前值更新列

And*_*rey 4 sql-server optimization

我有一个存储过程,应该有条件地更新同一个表中的一堆字段.有条件地,因为对于每个字段,我还传递"脏"标志,并且仅当flag设置为1时才应更新字段.

所以我要做以下事情:

create proc update 
@field1 nvarchar(1000), @field1Dirty bit, ...other fields...
as 
begin
    update mytable
    set field1 = case when @field1dirty = 1 then @field1 else field1 end,
    ... same for other fields
end 
go
Run Code Online (Sandbox Code Playgroud)

问题 - SQL Server(2008)是否足够智能,如果已经为其分配了自己的值,则不会对字段进行物理更新,例如@ field1dirty = 0?

kem*_*002 5

Question - is SQL Server (2008) smart enough to not physically update
Run Code Online (Sandbox Code Playgroud)

一个字段,如果它被分配了自己的值,就像@ field1dirty = 0的情况一样?

不,你应该添加一个说明......的where子句where field <> the value you are updating to.

这一开始看起来并不是什么大不了的事,但事实上它可能会产生大量的开销.举个例子,考虑一下触发器.如果更新表中的每个字段,则会触发该行的每一行.YIKES,这是很多代码执行,这是不必要的,特别是如果说代码,将更新行移动到日志表.我相信你明白了.

请记住,您正在更新该字段,它恰好与之前的值相同.发生这种情况实际上很好,因为这意味着您仍然可以将字段计数为已修改(想想时间戳等).如果它不认为将字段更新为相同的值正在修改行,您将不知道是否有人无意中(或故意)尝试更改数据.

由于评论而更新:链接到合并功能

示例:用于处理存储过程中的空参数值

Update Table SET My_Field = COALESCE(@Variable, My_Field)
Run Code Online (Sandbox Code Playgroud)

在将字段更新为相同值之前,这并没有解决我所说的内容,但它确实允许您检查参数并有条件地更新字段.

  • @Andrey - 你仍然可以使用`WHERE`将它们用`OR`分隔.SQL Server一次写入一行,因此如果满足任何条件,它将重写整行,并且您的性能不会受到影响. (2认同)