Я переглядаю це питання про дивні значення в 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()
? Я думаю, що це відповідне питання, яке може практично проявитись.