Detta är mycket likt:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Problemet är att med felaktig datatyp (FLOAT/REAL
) ordningen på aritmetiska operationer på flyttalsfrågor. Demo från 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öjliga lösningar:
CAST
alla argument till korrekt datatyp somDECIMAL/NUMERIC
- ändra tabell och ändra
FLOAT
tillDECIMAL
- du kan försöka tvinga frågeoptimeraren att beräkna summan med samma ordning.
Den goda nyheten är att när ett stabilt frågeresultat är viktigt för din applikation kan du tvinga ordningen att vara densamma genom att förhindra parallellism med ALTERNATIV (MAXDOP 1) .
Det ser ut som att den första länken är död. WebArchive