gpt4 book ai didi

sql-server - 使用当前值更新列

转载 作者:行者123 更新时间:2023-12-03 02:05:55 25 4
gpt4 key购买 nike

我有一个存储过程,它应该有条件地更新同一个表中的一堆字段。有条件地,因为对于每个字段,我还传递一个“脏”标志,并且只有当标志设置为 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

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

最佳答案

Question - is SQL Server (2008) smart enough to not physically update

a field if it's been assigned its own value, like in case if @field1dirty = 0?

不,您应该添加一个 where 子句,表示... where field <> the value you are updating to .

乍一看这似乎没什么大不了的,但实际上它会产生大量的开销。举一个例子,考虑一下触发器。如果更新表中的每个字段,则该触发器将为每一行触发。哎呀,这是很多不必要的代码执行,特别是如果该代码是将更新行移动到日志记录表的话。我相信你明白了。

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

根据评论更新:链接至coalesce function

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

Update Table SET My_Field = COALESCE(@Variable, My_Field)

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

关于sql-server - 使用当前值更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com