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