我有一个触发器,只要输入值,该触发器就会自动将给定条目的CreationDate和ModifiedDate设置为当前UTC时间。 (此后,CreationDate将保持不变,而ModifiedDate将在每次更新时通过另一个触发器进行更新)。

我想确保插入和从未更新过的项目的CreationDate和ModifiedDate值完全相同,因此我使用了这样的变量:

DECLARE @currentTime DATETIME
SELECT @currentTime = GETUTCDATE()
UPDATE dbo.MyTable SET CreationDate = @currentTime, ModifiedDate = @currentTime
    ...


以命令式编程的心态,我假设这可以防止GETUTCDATE()被调用两次,并可能产生略有不同的结果。这真的有必要吗?如果不是,这会更昂贵,更便宜,还是与以下代码完全相同?

UPDATE dbo.MyTable SET CreationDate = GETUTCDATE(), ModifiedDate = GETUTCDATE()
    ...

最佳答案

DECLARE @Counter INT = 1

WHILE (1 = (SELECT 1 WHERE GETUTCDATE()  = GETUTCDATE()))
SET @Counter = @Counter+1

SELECT @Counter /*Returns almost immediately with a number in the 000s for me.*/


并且只是为了证明在SELECT列表中也会发生这种情况。

DECLARE @T TABLE
(
rownum INT IDENTITY(1,1) PRIMARY KEY,
d1 datetime,
d2 datetime
)

WHILE (NOT EXISTS(SELECT * FROM @T WHERE d1 <> d2))
    BEGIN
    DELETE FROM @T
    INSERT INTO @T
    SELECT GETUTCDATE(),GETUTCDATE()
    END

SELECT * FROM @T


顺便说一句:如果由于某种原因要基于行评估GETUTCDATE(),可以将其包装在标量UDF中。

CREATE FUNCTION dbo.GETUTCDATE()
RETURNS DATETIME
WITH SCHEMABINDING
AS
BEGIN
RETURN GETUTCDATE()
END
GO

SELECT GETUTCDATE(),dbo.GETUTCDATE()
FROM master..spt_values

关于sql-server - 如果在同一条语句中使用两次,GETUTCDATE()是否会返回相同的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6036223/

10-10 05:55