Điều này rất giống với: SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
.
Vấn đề là với loại dữ liệu không chính xác (FLOAT/REAL
) thứ tự của các phép toán số học trên các vấn đề dấu phẩy động. Demo từ kết nối:
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
Các giải pháp khả thi:
-
CAST
tất cả các đối số cho loại dữ liệu chính xác nhưDECIMAL/NUMERIC
- thay đổi bảng và thay đổi
FLOAT
thànhDECIMAL
- bạn có thể cố gắng buộc trình tối ưu hóa truy vấn tính tổng với cùng một thứ tự.
Tin tốt là khi một kết quả truy vấn ổn định quan trọng đối với ứng dụng của bạn, bạn có thể buộc thứ tự giống nhau bằng cách ngăn chặn tính song song với OPTION (MAXDOP 1) .
Có vẻ như liên kết nội bộ đã chết. WebArchive