Tôi đang theo dõi câu hỏi này về các giá trị lạ trong một PERSISTED
cột được tính toán. Câu trả lời ở đó đưa ra một vài phỏng đoán về cách hành vi này xảy ra.
Tôi đang hỏi như sau: Đây có phải là một lỗi hoàn toàn không? Các PERSISTED
cột có bao giờ được phép hành xử theo cách này?
DECLARE @test TABLE (
Col1 INT,
Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1
INSERT INTO @test (Col1) VALUES
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5))
SELECT * FROM @test --shows impossible data
UPDATE @test SET Col1 = Col1*1 --"fix" the data by rewriting it
SELECT * FROM @test --observe fixed data
/*
Col1 Contains2
2 0
2 0
0 1
4 0
3 0
Col1 Contains2
2 1
2 1
0 0
4 0
3 0
*/
Lưu ý rằng dữ liệu xuất hiện "không thể" vì các giá trị của cột được tính toán không tương ứng với định nghĩa của nó.
Người ta biết rằng các hàm không xác định trong các truy vấn có thể hoạt động kỳ lạ nhưng ở đây điều này dường như vi phạm hợp đồng của các cột được tính toán bền vững và do đó, là bất hợp pháp.
Chèn số ngẫu nhiên có thể là một kịch bản có sẵn nhưng nếu chúng ta chèn NEWID()
giá trị hay SYSUTCDATETIME()
thì sao? Tôi nghĩ rằng đây là một vấn đề có liên quan mà thực tế có thể tự biểu hiện.