Sto seguendo questa domanda sugli strani valori in una PERSISTED
colonna calcolata. La risposta lì fa alcune ipotesi su come questo comportamento è diventato.
Sto chiedendo quanto segue: questo non è un vero e proprio bug? Le PERSISTED
colonne sono mai autorizzate a comportarsi in questo modo?
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
*/
Si noti che i dati sembrano "impossibili" perché i valori della colonna calcolata non corrispondono alla sua definizione.
È noto che le funzioni non deterministiche nelle query possono comportarsi in modo strano, ma qui ciò sembra violare il contratto di colonne calcolate persistenti e, pertanto, dovrebbe essere illegale.
L'inserimento di numeri casuali potrebbe essere uno scenario forzato, ma cosa accadrebbe se stessimo inserendo NEWID()
valori o SYSUTCDATETIME()
? Penso che questo sia un problema rilevante che potrebbe manifestarsi praticamente.