Ich verfolge diese Frage nach seltsamen Werten in einer PERSISTED
berechneten Spalte. Die Antwort darauf lässt ein paar Vermutungen darüber aufkommen, wie dieses Verhalten zustande gekommen ist.
Ich frage folgendes: Ist das nicht ein völliger Fehler? Dürfen sich PERSISTED
Spalten jemals so verhalten?
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
*/
Beachten Sie, dass die Daten als "unmöglich" erscheinen, da die Werte der berechneten Spalte nicht ihrer Definition entsprechen.
Es ist bekannt, dass sich nicht deterministische Funktionen in Abfragen seltsam verhalten können, aber hier scheint dies den Vertrag von persistierten berechneten Spalten zu verletzen und sollte daher illegal sein.
Das Einfügen von Zufallszahlen mag ein ausgedachtes Szenario sein, aber was ist, wenn wir NEWID()
Werte einfügen oder SYSUTCDATETIME()
? Ich denke, dies ist ein relevantes Thema, das sich praktisch manifestieren könnte.