Hesaplanan bir sütundaki garip değerler hakkında bu soruyu takip ediyorum PERSISTED
. Bu sorunun cevabı, bu davranışın nasıl ortaya çıktığı hakkında birkaç tahmin yapıyor.
Şu soruyu soruyorum: Bu açık bir hata değil mi? Are PERSISTED
sütunlar Hiç bu şekilde davranmasına izin?
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
*/
Hesaplanan sütunun değerleri tanımına karşılık gelmediğinden, verilerin "imkansız" göründüğünü unutmayın.
Sorgularda deterministik olmayan fonksiyonların garip davranabileceği iyi bilinir, ancak burada bu, hesaplanmış sütunların kalıcılığını ihlal ettiği ve bu nedenle yasadışı olması gerektiği görülmektedir.
Rastgele sayılar eklemek tartışmalı bir senaryo olabilir, ancak NEWID()
değerler ekleseydik ya da SYSUTCDATETIME()
? Bence bu pratik olarak kendini gösterebilecek ilgili bir konudur.