計算列の奇妙な値に関するこの質問をフォローしていPERSISTED
ます。そこでの答えは、この振る舞いがどのようになったかについていくつかの推測をします。
私は次を求めています:これは完全なバグではありませんか?されているPERSISTED
列は、今までにこのように動作することが許可されていますか?
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
*/
計算列の値がその定義に対応していないため、データは「不可能」に見えることに注意してください。
クエリ内の非決定的関数が奇妙に動作する可能性があることはよく知られていますが、ここでは永続化された計算列の規約に違反するため、違法であるはずです。
私たちが挿入された場合には、乱数を挿入すると、不自然なシナリオが、何であるかもしれないNEWID()
値をかSYSUTCDATETIME()
?これは関連する問題であり、実際に明らかになると思います。