我正在跟踪有关计算列中的奇怪值的问题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()呢?我认为这是一个相关问题,实际上可能会体现出来。
