SQL 服务器默认值是在插入之前还是之后生成的?

Are SQL Server defaults generated before or after the insert?

我有一个 table 看起来像这样

CREATE TABLE bob
    (ID INT IDENTITY,
    blah VARBINARY(MAX),
    ts DATETIME2 DEFAULT GETUTCDATE())

让我们假设这个语句

INSERT INTO dbo.bob
        ( blah )
VALUES  (
          @blarg
          )

需要 10 秒才能完成。

如果开始插入的时间是t。 ts 在新创建的行上会有 t 或 t + 10 秒吗?换句话说,默认值是在插入开始时生成还是在插入结束时生成(或其他一些规则)?

GETUTCDATE 是一个 runtime constant

它将在开始时计算一次,并始终对语句插入的所有行使用相同的值。

但是,如果您将其包装在调用 GETUTCDATE 的标量 UDF 中并更改默认值以调用 UDF,您可能会看到不同的值,因为它是逐行计算的。

对于单行语句,我想这取决于 10 秒延迟的位置。如果它不能在 10 秒内编译计划,那么直到那时它才会开始执行,所以这就是时间。如果它开始执行并等待锁定,我想它应该在等待之前分配一个时间,因为运行时常量应该已经被解析。