La columna calculada no puede persistir porque la columna no es determinista


9

Sé que esta no es la primera vez que se hace este tipo de preguntas.

Pero, ¿por qué en el siguiente escenario se crea la columna calculada persistente "no determinista". La respuesta siempre debe ser la misma, ¿verdad?

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

Mensaje 4936, Nivel 16, Estado 1, Línea 42 La columna calculada 'UTCTime' en la tabla 'prueba' no puede persistir porque la columna no es determinista.

Creo que estoy siguiendo las reglas deterministas aquí .

¿Es posible crear una columna computada persistente aquí?

Respuestas:


8

Convertir una cadena en una fecha sin un número de estilo no es determinista, tampoco hay razón para usar un número de estilo al convertir una fecha o fecha y hora en fecha y hora2. Tratar:

ALTER TABLE dbo.test 
    ADD UTCTime AS CONVERT(datetime2,ISNULL(EventTime, 
    DATEADD(SECOND, PosixTime, CONVERT(datetime,'1970-01-01',120)))) 
    PERSISTED;

Aunque tengo curiosidad por qué necesitas persistir en esta columna. Si es así, puede indexarlo, no necesita persistir una columna para indexarlo ...


11

Debe usar un estilo determinista al convertir desde una representación de cadena .

No estaba utilizando un estilo determinista con la conversión de cadena a date.

Especificabas innecesariamente un estilo al convertir de fecha a datetime2.

Hay una mezcla confusa de tipos de datos de fecha / hora en la pregunta.

Esto funciona (produciendo una datetimecolumna):

ALTER TABLE dbo.test 
ADD UTCTime AS 
    ISNULL
    (
        EventTime,
        DATEADD
        (
            SECOND, 
            PosixTime, 
            CONVERT(datetime, '19700101', 112)
        )
    )
    PERSISTED;

Como Aaron mencionó (estábamos respondiendo simultáneamente), no es necesario que persista una columna determinista para indexarla.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.