Dies ist sehr ähnlich zu:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Das Problem ist, dass bei ungenauem Datentyp (FLOAT/REAL
) die Reihenfolge arithmetischer Operationen auf Gleitkommazahlen. Demo von 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
Mögliche Lösungen:
CAST
alle Argumente zum genauen Datentyp wieDECIMAL/NUMERIC
- Tabelle ändern und
FLOAT
ändern zuDECIMAL
- Sie können versuchen, den Abfrageoptimierer zu zwingen, die Summe mit derselben Reihenfolge zu berechnen.
Die gute Nachricht ist, dass Sie, wenn ein stabiles Abfrageergebnis für Ihre Anwendung wichtig ist, die gleiche Reihenfolge erzwingen können, indem Sie die Parallelität mit OPTION (MAXDOP 1) verhindern .
Es sieht so aus, als wäre der ursprüngliche Link tot. WebArchiv