Questo è molto simile a:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Il problema è che con tipo di dati impreciso (FLOAT/REAL
) l'ordine delle operazioni aritmetiche su argomenti in virgola mobile. Demo da Connect:
DECLARE @fl FLOAT = 100000000000000000000
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
SET @fl = @fl + CONVERT(float, 5000)
SET @i = @i + 1
END
SET @fl = @fl - 100000000000000000000
SELECT CONVERT(NVARCHAR(40), @fl, 2)
-- 0.000000000000000e+000
DECLARE @fl FLOAT = 0
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
SET @fl = @fl + CONVERT(float, 5000)
SET @i = @i + 1
END
SET @fl = @fl + 100000000000000000000
SET @fl = @fl - 100000000000000000000
SELECT @fl
-- 507904
LiveDemo
Possibili soluzioni:
CAST
tutti gli argomenti per un tipo di dati accurato comeDECIMAL/NUMERIC
- modifica la tabella e cambia
FLOAT
aDECIMAL
- puoi provare a forzare Query Optimizer a calcolare la somma con lo stesso ordine.
La buona notizia è che quando un risultato di query stabile è importante per la tua applicazione, puoi forzare l'ordine in modo che sia lo stesso prevenendo il parallelismo con OPTION (MAXDOP 1) .
Sembra che il collegamento iniziale sia morto. Archivio Web