Dette er meget lig:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Problemet er det med unøjagtig datatype (FLOAT/REAL
) rækkefølgen af af aritmetiske operationer på flydende komma spørgsmål. Demo fra 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
Mulige løsninger:
CAST
alle argumenter til nøjagtig datatype somDECIMAL/NUMERIC
- ændre tabel og ændre
FLOAT
tilDECIMAL
- du kan prøve at tvinge forespørgselsoptimering til at beregne summen med samme rækkefølge.
Den gode nyhed er, at når et stabilt forespørgselsresultat er vigtigt for din applikation, kan du tvinge ordren til at være den samme ved at forhindre parallellisme med OPTION (MAXDOP 1) .
Det ser ud til, at det oprindelige link er dødt. WebArkiv