Isso é muito semelhante a:
SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
. O problema é que com tipo de dados impreciso (
FLOAT/REAL
) a ordem das operações aritméticas em questões de ponto flutuante. Demonstração da conexão: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
Soluções possíveis:
CAST
todos os argumentos para tipos de dados precisos comoDECIMAL/NUMERIC
- alterar tabela e alterar
FLOAT
paraDECIMAL
- você pode tentar forçar o otimizador de consulta a calcular a soma com a mesma ordem.
A boa notícia é que quando um resultado de consulta estável é importante para seu aplicativo, você pode forçar a ordem a ser a mesma evitando o paralelismo com OPTION (MAXDOP 1) .
Parece que o link inicial está morto. WebArchive