Това е много подобно на:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Проблемът е, че с неточен тип данни (FLOAT/REAL
) редът на аритметичните операции върху въпросите с плаваща запетая. Демо от 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
Възможни решения:
CAST
всички аргументи за точен тип данни катоDECIMAL/NUMERIC
- променете таблицата и променете
FLOAT
доDECIMAL
- можете да опитате да принудите оптимизатора на заявки да изчисли сумата със същия ред.
Добрата новина е, че когато стабилният резултат от заявката има значение за вашето приложение, можете да принудите поръчката да бъде същата, като предотвратите паралелизъм с OPTION (MAXDOP 1) .
Изглежда, че първоначалната връзка е мъртва. WebArchive