계산 된 열의 이상한 값에 대한 이 질문을 수행하고 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()
어떻습니까? 나는 이것이 실제로 나타날 수있는 관련 문제라고 생각합니다.