sql >> Databasteknik >  >> RDS >> Sqlserver

Genomsnittlig floatinkonsekvens

Detta är mycket likt:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Problemet är att med felaktig datatyp (FLOAT/REAL ) ordningen på aritmetiska operationer på flyttalsfrågor. Demo från 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

Möjliga lösningar:

  • CAST alla argument till korrekt datatyp som DECIMAL/NUMERIC
  • ändra tabell och ändra FLOAT till DECIMAL
  • du kan försöka tvinga frågeoptimeraren att beräkna summan med samma ordning.

Den goda nyheten är att när ett stabilt frågeresultat är viktigt för din applikation kan du tvinga ordningen att vara densamma genom att förhindra parallellism med ALTERNATIV (MAXDOP 1) .

Det ser ut som att den första länken är död. WebArchive




  1. PostgreSQL SKAPA TABELL

  2. Hur man räknar objekt i kommaseparerad lista MySQL

  3. Relationella vs icke-relationella databaser:Vad är skillnaden?

  4. lagra långa värden i Android-databasen