Eu sei que não é a primeira vez que esse tipo de pergunta é feita.
Mas por que no cenário a seguir a coluna computada persistente está sendo criada "não determinística". A resposta deve ser sempre a mesma, certo?
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
Msg 4936, Level 16, State 1, Line 42 A coluna computada 'UTCTime' na tabela 'test' não pode ser mantida porque a coluna não é determinística.
Acho que estou seguindo as regras determinísticas aqui .
É possível criar uma coluna computada persistente aqui?
Converter uma string em uma data sem um número de estilo não é determinístico, também não há razão para usar um número de estilo ao converter uma data ou data e hora em data e hora2. Tentar:
Embora eu esteja curioso por que você precisa persistir nesta coluna. Se for para indexá-lo, você não precisa persistir uma coluna para indexá-lo ...
Você precisa usar um estilo determinístico ao converter de uma representação de string .
Você não estava usando um estilo determinístico com a conversão de string para
date
.Você estava especificando desnecessariamente um estilo ao converter de data para
datetime2
.Há uma mistura confusa de tipos de dados de data/hora na pergunta.
Isso funciona (produzindo uma
datetime
coluna):Como Aaron mencionou (estávamos respondendo simultaneamente), você não precisa persistir uma coluna determinística para indexá-la.