Esto es muy similar a:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
El problema es que con un tipo de datos inexacto (FLOAT/REAL
) el orden de las operaciones aritméticas en materia de punto flotante. Demostración de conectar:
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
Posibles soluciones:
CAST
todos los argumentos para un tipo de datos preciso comoDECIMAL/NUMERIC
- modifique la tabla y cambie
FLOAT
aDECIMAL
- puede intentar forzar el optimizador de consultas para calcular la suma con el mismo orden.
La buena noticia es que cuando un resultado de consulta estable es importante para su aplicación, puede forzar que el orden sea el mismo al evitar el paralelismo con OPCIÓN (MAXDOP 1) .
Parece que el enlace inicial está muerto. Archivo web