我有一个触发器,只要输入值,该触发器就会自动将给定条目的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/