是否在插入之前或之后生成SQL Server默认值?

Cog*_*man 3 sql-server sql-insert

我有一张看起来像这样的桌子

CREATE TABLE bob
    (ID INT IDENTITY,
    blah VARBINARY(MAX),
    ts DATETIME2 DEFAULT GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

我们假设这个陈述

INSERT INTO dbo.bob
        ( blah )
VALUES  (
          @blarg
          )
Run Code Online (Sandbox Code Playgroud)

需要10秒钟才能完成.

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

Mar*_*ith 6

GETUTCDATE运行时常量

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

但是,如果要将其包装在标量UDF调用中GETUTCDATE并更改默认值以调用UDF,则可能会看到不同的值,然后逐行进行评估.

对于单行语句,我猜它取决于10秒延迟的位置.如果它无法编译计划10秒钟,它将不会在那之前开始执行,所以这将是时间.如果它开始执行并等待锁定,我会想象它应该在等待之前分配一段时间,因为运行时常量应该已经解决了.