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