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