我们的一位应用程序开发人员向我提出了一个有趣的问题。在下面的代码中,您将看到更新语句将当前列值分配给两个变量,同时还将这些相同的列更新为新值。
问题是,是否保证变量@oStart 和@oFinish 将分配给[Start] 和 [Finish] 的旧值而不是新值?在测试中,情况确实如此,但是,我想确认这是有保证的行为。
我希望答案是“不——不能保证”,最终取决于优化器的决定。无论如何,这种模棱两可的代码无论如何都是不鼓励的(有更优雅和可读性更高的编写方式),但有兴趣听听大家的想法。
-- Parameters
DECLARE @StartDate smalldatetime = '2022-01-01',
@EndDate smalldatetime = '2022-12-31';
-- Body
DECLARE @oStart smalldatetime,
@oFinish smalldatetime;
UPDATE [dbo].[MyTable]
SET @oStart = [Start],
@oFinish = [Finish],
[Start] = @StartDate,
[Finish] = @EndDate
WHERE [ID] = 12;
是的,这是有记录的。
@variable
请参阅语法中的文档UPDATE
。SET @variable = column = expression
(与将变量设置为赋值后的值的文档相反)column = expression
。退货
假设
ID
是主键,因此UPDATE
保证最多影响一行然后我个人认为如果您需要将该值分配给 SQL 变量,则此语法很好。它胜过必须使用该
OUTPUT ... INTO
子句将这些值存储在某处,然后SELECT
从该子句中分配给变量。SQL标准规定
(强调我的)。在您的情况下,这意味着,根据标准,
@oStart
并且必须分别具有和@oFinish
的值,因为它们在更新之前存在。[Start]
[Finish]
现在,SQL Server 是否符合这方面的标准是另一个问题。