Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Средно несъответствие на float

Това е много подобно на:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Проблемът е, че с неточен тип данни (FLOAT/REAL ) редът на аритметичните операции върху въпросите с плаваща запетая. Демо от 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

Възможни решения:

  • CAST всички аргументи за точен тип данни като DECIMAL/NUMERIC
  • променете таблицата и променете FLOAT до DECIMAL
  • можете да опитате да принудите оптимизатора на заявки да изчисли сумата със същия ред.

Добрата новина е, че когато стабилният резултат от заявката има значение за вашето приложение, можете да принудите поръчката да бъде същата, като предотвратите паралелизъм с OPTION (MAXDOP 1) .

Изглежда, че първоначалната връзка е мъртва. WebArchive




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте XEvent Profiler за улавяне на заявки в SQL Server

  2. Избягвайте дублирането в заявката INSERT INTO SELECT в SQL Server

  3. Преструктуриране и реорганизиране на индекса на SQL Server

  4. Как да получите ефективно управление на блокиране на Sql Server в C# с ADO?

  5. Разделете една колона на няколко реда