代码之家  ›  专栏  ›  技术社区  ›  Fredou

带有update和2 datetime字段以及getdate()的sql server

  •  0
  • Fredou  · 技术社区  · 14 年前

    要求是,两个字段必须相等,您会怎么做

    declare @var datetime
    
    set @var = getdate()
    
    update table set f1=@var,f2=@var
    

    或者只是

    update table set f1=getdate(),f2=getdate()
    
    4 回复  |  直到 14 年前
        1
  •  5
  •   dcp    14 年前

    当然是第一种方法,因为对getdate()的两个调用很可能返回不同的值。

        2
  •  2
  •   Martin Smith    14 年前

    原始答案: getdate() 好像是 rand() 并且在查询中只计算一次。这个查询花了一分钟多的时间才返回 获取日期() 它们是一样的。

    select getdate()
    from sys.objects s1, sys.objects s2, sys.objects s3
    

    但是当我查看更新2个不同列的查询计划时,我可以看到compute scalar操作符正在调用

    兰德()

    CREATE TABLE #t(
        [f1] [float] NULL,
        [f2] [float] NULL,
    )
    insert into #t values (1,1)
    insert into #t values (2,2)
    insert into #t values (3,3)
    
    
    update #t set f1=rand(),f2=rand()
    select * from #t
    

    这给了

    f1                     f2
    ---------------------- ----------------------
    0.54168308978257       0.574235819564939
    0.54168308978257       0.574235819564939
    0.54168308978257       0.574235819564939
    
        3
  •  0
  •   Raj More    14 年前

    实际上,这取决于SQL的版本。

    GetDate()是一个确定性函数 SQL 2005之前

    ,Getdate()是不确定的,这意味着每次调用它都会得到不同的值。

    由于这两个GetDate()函数都将在更新开始前进行求值,因此它们将返回相同的值。

    不知道表和分区的大小以及服务器上的负载,我会选择选项1

        4
  •  0
  •   AllenG    14 年前

    我要谈的不是性能:可读性/意图传达。

    按照这些思路,方案一可能更好。实际上,您正在告诉未来的开发人员“我正在显式地设置 f1 f2 如果将来需求发生变化,以及(由于某种原因) 必须在不同的时间进行更新(或者某些东西发生了变化,它们在不同的时间进行了评估),这两个时间的datetime仍然相同。

    f1层 f2层