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