Jest to bardzo podobne do:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Problem polega na tym, że przy niedokładnym typie danych (FLOAT/REAL
) kolejność operacji arytmetycznych na zagadnieniach zmiennoprzecinkowych. Demo z połączenia:
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
Możliwe rozwiązania:
CAST
wszystkie argumenty do dokładnego typu danych, jakDECIMAL/NUMERIC
- zmień tabelę i zmień
FLOAT
naDECIMAL
- możesz spróbować zmusić optymalizator zapytań do obliczenia sumy w tej samej kolejności.
Dobrą wiadomością jest to, że gdy stabilny wynik zapytania ma znaczenie dla Twojej aplikacji, możesz wymusić taką samą kolejność, zapobiegając równoległości za pomocą OPTION (MAXDOP 1) .
Wygląda na to, że link początkowy jest martwy. Archiwum internetowe