【问题标题】:What's the columns updating order when several columns are updated?更新几列时,列更新顺序是什么?
【发布时间】:2017-07-02 17:08:50
【问题描述】:

我有一张简单的桌子:

Col001
Col002
...
ColNNN
...
Col001_DateTimeModified
Col002_DateTimeModified
...
ColNNN_DateTimeModified

ColXXX 保存值,ColNNN_DateTimeModified 保存修改(插入或更新)值的相应日期和时间。

当更新一列的值时,将使用给定行的所有列值。我想更新修改时间列,只有当新的相应列被更新时。所以,我有:

UPDATE MyTable
SET Col001 = S.[Col001] 
   ,Col002 = S.[Col002]
   ,...
   ,Col001_DateTimeModified = IIF(Col001 = S.[Col001], Col001_DateTimeModified, GETUTCDATE())
   ,Col002_DateTimeModified = IIF(Col002 = S.[Col002], Col002_DateTimeModified, GETUTCDATE())
   ,...
FROM MyTable T
INNER JOIN NewData S
    ON T.[id] = S.[id]

我可以确定,当评估行 Col001_DateTimeModified = IIF(Col001 = S.[Col001], Col001_DateTimeModified, GETUTCDATE()) 时,Col001 仍保持其原始值,而不是 Col001 = S.[Col001] 行执行后的值?

【问题讨论】:

  • 从您的角度来看,SQL Server 当时没有更新列。它将整个更新语句作为一个语句运行。

标签: sql-server tsql sql-update sql-server-2016


【解决方案1】:

是的。这些值不是连续更新的,而是一次更新的。示例:

create table #test (x int, y int, z int)

insert into #test values (1,2,3)

update #test
set y= x + z, z= iif(y=2,100,200)
where x=1

select * from #test

x   y   z
1   4   100

如果按顺序更新值,则 z 的值为 200。

【讨论】:

  • 一个更简单的例子是create table #test (x int, y int);insert into #test values (1,2);update #test set y= x, x=y; select * from #test;
  • @MartinSmith 我举了一个类似于 OP 自己的代码的例子。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 2012-11-14
  • 2017-11-12
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多