Saya menindaklanjuti pertanyaan ini tentang nilai aneh di PERSISTED
kolom yang dihitung. Jawaban di sana membuat beberapa tebakan tentang bagaimana perilaku ini terjadi.
Saya bertanya yang berikut: Apakah ini bukan bug langsung? Apakah PERSISTED
kolom pernah diizinkan berperilaku seperti ini?
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
*/
Perhatikan, bahwa data tampak "tidak mungkin" karena nilai kolom yang dihitung tidak sesuai dengan definisinya.
Telah diketahui secara umum bahwa fungsi non-deterministik dalam kueri dapat berperilaku aneh, tetapi di sini ini tampaknya melanggar kontrak kolom yang dikomputasi yang bertahan dan, oleh karena itu, harus ilegal.
Memasukkan angka acak mungkin merupakan skenario yang dibuat-buat tetapi bagaimana jika kita memasukkan NEWID()
nilai atau SYSUTCDATETIME()
? Saya pikir ini adalah masalah yang relevan yang mungkin bisa terwujud.