Sql server SQL Server:被GETDATE()吸引

Sql server SQL Server:被GETDATE()吸引,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我有SQL Server 2005标准Service Pack 2 9.00.4053.00(英特尔X86) 表中有近3000万行 如果我这样做 SELECT GETDATE(), * FROM <table> 我知道你真的很想做 DECLARE @DT datetime SET @DT = GETDATE() UPDATE table SET datecol =@DT 我真的很困惑 预期的行为是什么 如果是我先前发布的select语句 update语句的行为 考虑到您正在更新一

我有SQL Server 2005标准Service Pack 2 9.00.4053.00(英特尔X86)

表中有近3000万行

如果我这样做

SELECT GETDATE(), * FROM
<table>
我知道你真的很想做

DECLARE @DT datetime
SET @DT = GETDATE()
UPDATE table
SET datecol =@DT
我真的很困惑

预期的行为是什么

  • 如果是我先前发布的select语句
  • update语句的行为
  • 考虑到您正在更新一个包含1亿行的表上的datecolun datecolumn是否具有相同的日期和时间(以毫秒为单位)…?

    GetDate()
    从来都不是确定性的。确定性意味着当传递相同的参数时,它将始终返回相同的结果

    rand()
    一样,它对每列计算一次,但对所有行计算一次仍然相同

    使用
    rand()
    比使用
    getdate()

    返回

    ---------------------- ----------------------
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    
    如果你尝试以下方法

    select top 10 getdate(), getdate()
    from sys.objects
    
    查看实际执行计划中的ComputeScalar运算符属性,您将看到
    GetDate()
    计算了两次


    注意:在SQL 2000之后,每列而不是每查询的求值行为可能发生了变化(我不知道),但这不是BOL定义为确定性的含义。

    根据Martin Smith的回答,所指的确定性是udf行为的变化。在SQL Server 2000中,无法在udf中使用GETDATE。您可以在SQLServer2005中使用

    正如Martin Smith所说,有些函数是按列、按查询计算的。不是每行。GETDATE是一个,RAND是另一个

    如果确实需要对GETDATE逐行求值,则将其包装在udf中

    编辑:


    NEWID在统计上是唯一的。它必须逐行计算,以便在另一行中不会出现相同的值。因此,
    CHECKSUM(NEWID())
    生成逐行随机数的技巧…

    Martin,为什么NEWID()返回不同的结果?@cshah-好问题,我不知道答案@cshah,@Martin Smith:请看我对NEWID+1的回答:我通过在两个getdate()之间抛出几千个
    RAND()来验证您提到的行为(SQL Server 2008)。谢谢,但是为什么NEWID的行为不一样呢?从sys.objects中选择前4个newid(),newid(),我的理解是,如果您想随机返回行,那么按newid()排序,那么newid()是不同的…更新的行为会是一样的吗?ie.UPDATE tableName SET dateColumn=GETDATE()确定它将与。。哑巴:-(
    
    ---------------------- ----------------------
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    0.0566172633850772     0.431111195699363
    
    select top 10 getdate(), getdate()
    from sys.objects