Cột được tính không thể được duy trì vì cột không xác định


9

Tôi biết đây không phải là lần đầu tiên loại câu hỏi này được hỏi.

Nhưng tại sao trong kịch bản sau đây, cột được tính toán bền vững được tạo ra "không xác định". Câu trả lời phải luôn giống nhau, phải không?

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, Cấp 16, Trạng thái 1, Dòng 42 Cột tính toán 'UTCTime' trong bảng 'thử nghiệm' không thể tồn tại vì cột không xác định.

Tôi nghĩ rằng tôi đang tuân theo các quy tắc xác định ở đây .

Có thể tạo một cột tính toán bền bỉ ở đây?

Câu trả lời:


8

Chuyển đổi một chuỗi thành một ngày không có số kiểu không phải là xác định, cũng không có lý do gì để sử dụng số kiểu khi chuyển đổi ngày hoặc datetime thành datetime2. Thử:

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

Mặc dù tôi tò mò tại sao bạn cần phải duy trì cột này. Nếu đúng như vậy, bạn có thể lập chỉ mục cho nó, bạn không cần phải duy trì một cột để lập chỉ mục cho nó ...


11

Bạn cần sử dụng một kiểu xác định khi chuyển đổi từ biểu diễn chuỗi .

Bạn không sử dụng kiểu xác định với chuyển đổi từ chuỗi sang date.

Bạn không cần thiết chỉ định một kiểu khi chuyển đổi từ ngày sang datetime2.

Có một hỗn hợp khó hiểu của các loại dữ liệu ngày / thời gian trong câu hỏi.

Công việc này (sản xuất một datetimecột):

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

Như Aaron đã đề cập (chúng tôi đã trả lời đồng thời), bạn không cần phải duy trì một cột xác định để lập chỉ mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.