Sql server SQL Server默认值是在插入之前还是之后生成的?

Sql server SQL Server默认值是在插入之前还是之后生成的?,sql-server,sql-insert,Sql Server,Sql Insert,我有一张像这样的桌子 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秒?换句话说,默认

我有一张像这样的桌子

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

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

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


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

你错了。我只是仔细检查了一下。当用作默认约束时,GETDATE和GETDATEUTC将与每个insert语句一起重新运行。@Cogman您还没有正确阅读我的答案。它当然不会声称该值将在语句之间持续存在。我说的是在一条语句中插入多行,而insert语句只需要10秒钟,这是我的错误。你说得对:)。我重读了你的声明,它是有道理的。很抱歉搞混了。