【问题标题】:Are SQL Server defaults generated before or after the insert?SQL Server 默认值是在插入之前还是之后生成的?
【发布时间】:2016-04-13 20:02:41
【问题描述】:

我有一张像这样的表

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 秒吗?换句话说,默认值是在插入开始还是在插入结束时生成(或其他规则)?

【问题讨论】:

    标签: sql-server sql-insert


    【解决方案1】:

    GETUTCDATEruntime constant

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

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

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

    【讨论】:

    • 你错了。我刚刚仔细检查以验证。当用作默认约束时,GETDATE 和 GETDATEUTC 会在每个插入语句中重新运行。
    • @Cogman 你还没有正确阅读我的答案。它当然没有声称该值将在语句之间持续存在。我说的是在单个语句中插入多行并且插入语句需要 10 秒的情况。
    • 我的错误。你说的对 :) 。我重读了你的陈述,这是有道理的。很抱歉造成混乱。
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2011-04-22
    • 2011-07-27
    相关资源
    最近更新 更多