To je velmi podobné:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Problém je v tom, že s nepřesným datovým typem (FLOAT/REAL
) pořadí aritmetických operací na záležitostech s pohyblivou řádovou čárkou. Demo z připojení:
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žná řešení:
CAST
všechny argumenty na přesný datový typ jakoDECIMAL/NUMERIC
- změňte tabulku a změňte
FLOAT
naDECIMAL
- můžete zkusit donutit optimalizátor dotazů, aby vypočítal součet ve stejném pořadí.
Dobrou zprávou je, že když pro vaši aplikaci záleží na stabilním výsledku dotazu, můžete vynutit, aby pořadí bylo stejné tím, že zabráníte paralelismu pomocí OPTION (MAXDOP 1) .
Vypadá to, že původní odkaz je mrtvý. Webový archiv