我遇到了一个我要投入生产的程序的问题。问题是,我将对此过程的一部分进行更新,如下所示:
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等?
我尝试在不同的服务器上执行它,但是,正如预期的那样,我真的没有那么多人来检查它是否总能像我期望的那样工作。
答案 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语句,提供要更新的数据值 或插入。