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