SQL更新。在同一语句中使用和更改值。总是一样的行为?

时间:2015-01-23 11:42:26

标签: sql sql-server tsql stored-procedures sql-update

我遇到了一个我要投入生产的程序的问题。问题是,我将对此过程的一部分进行更新,如下所示:

DECLARE @paramStartDate DATETIME = '2014-12-31 23:00'

UPDATE [table1]
SET    EndDate = Dateadd(hour, 23, StartDate),
       UpdateDate = Getdate(),
       StartDate = @paramStartDate
WHERE  StartDate < @paramStartDate 

此更新语句按预期工作,但我的问题是:此过程执行的位置是否重要?更新是否总是先分配新EndDate,然后再分配StartDate?没有可能影响它的环境设置,TimeZone等?

我尝试在不同的服务器上执行它,但是,正如预期的那样,我真的没有那么多人来检查它是否总能像我期望的那样工作。

1 个答案:

答案 0 :(得分:1)

在SQL Server中,由于@ a-horse-with-no-name指出我非常确定任何“标准”SQL数据库,SET子句中的表达式 S 在逻辑上执行同时。 SQL Server需要首先读取SET期间要使用的所有列的值,然后继续物理更新列。以下TechNet文章支持此视图:https://technet.microsoft.com/en-us/library/ms190623(v=sql.105).aspx。 在“处理其他语句”部分中,您可以阅读

  

处理SELECT语句所描述的基本步骤适用于   其他SQL语句,如INSERT,UPDATE和DELETE。更新和   DELETE语句都必须以要修改的行集为目标   或删除。识别这些行的过程是相同的过程   用于标识有助于结果集的源行   一个SELECT语句。 UPDATE和INSERT语句都可以包含   嵌入式SELECT语句,提供要更新的数据值   或插入。