修改用于更新其他字段的字段是否安全?

时间:2014-08-11 18:06:01

标签: sql-server sql-update

现在这是一个执行的有效语句,我观察到它执行了所需的操作。我的问题:在SQL Server的单个语句中执行此操作是否可靠?可靠,我的意思是FooBar的值更改为Bar之前将设置为null的原始值。

update SomeTable
set Foo = Bar,
    Bar = null

请注意,我在问一个关于SQL Server基本设计的问题。因此,我对超出观察范围的答案感兴趣,并且要么引用Microsoft(或旧的sybase)文档和/或令人信服地说明为什么SQL Server在低级基础级别以某种方式工作。

3 个答案:

答案 0 :(得分:2)

是的,这将在SQL Server中按照您的意愿运行。在Bar设置为NULL之前,Foo将被设置为Bar。

编辑:来源 - http://dba.fyicenter.com/faq/sql_server/Importance_of_Column_Order_in_SET_Clause.html

答案 1 :(得分:1)

为了安全起见,我将此UPDATE拆分为两个单独的Update语句,并在一个事务中包装两个UPDATE语句。

我不认为您在SET子句中提及列的顺序决定首先更新哪个列。 因此,为了保持简单,我会做如下......

BEGIN TRANSACTION;

 update SomeTable
    set Foo = Bar

 update SomeTable
   set Bar = null

COMMIT TRANSACTION;

答案 2 :(得分:1)

SET列顺序无关紧要。在更新期间,SQL Server正在维护该行的旧副本和该行的新副本。所有计算仅使用旧值完成。

您甚至可以执行此操作来交换两列中的值

update SomeTable
set Foo = Bar,
    Bar = Foo

SQL Fiddle Demo