我知道这不是第一次被问到这类问题。
但是为什么在以下场景中创建的持久计算列是“非确定性的”。答案应该总是一样的,对吧?
CREATE TABLE dbo.test (Id INT, EventTime DATETIME NULL, PosixTime INT NOT NULL)
GO
DECLARE @EventTime DATETIME = '20181001 12:00:00'
DECLARE @GPSTime INT = DATEDIFF(SECOND, '19700101', @EventTime)
INSERT INTO dbo.Test(Id, EventTime, PosixTime)
VALUES (1, @EventTime, @GPSTime)
, (2, NULL, @GPSTime)
GO
SELECT * FROM dbo.test
GO
ALTER TABLE dbo.test ADD UTCTime AS CONVERT(DATETIME2,ISNULL(EventTime, DATEADD(SECOND, PosixTime, CONVERT(DATE,'19700101'))),112) PERSISTED
GO
消息 4936,级别 16,状态 1,第 42 行表 'test' 中的计算列 'UTCTime' 无法持久化,因为该列是不确定的。
我想我在这里遵循确定性规则。
是否可以在这里创建一个持久计算列?
将字符串转换为没有样式编号的日期不是确定性的,在将日期或日期时间转换为 datetime2 时也没有理由使用样式编号。尝试:
虽然我很好奇为什么你需要坚持这个专栏。如果是这样你可以索引它,你不需要持久化一个列来索引它......
从字符串表示转换时,您需要使用确定性样式。
您没有使用确定性样式将字符串转换为
date
.从 date 转换为
datetime2
.问题中的日期/时间数据类型混合在一起令人困惑。
这有效(产生一
datetime
列):正如 Aaron 提到的(我们同时回答),您不需要持久化确定性列来对其进行索引。