यह बहुत समान है:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
।
समस्या यह है कि गलत डेटाटाइप (FLOAT/REAL
.) के साथ ) फ्लोटिंग पॉइंट मामलों पर अंकगणितीय संचालन का क्रम। कनेक्ट से डेमो:
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) के साथ समांतरता को रोककर आदेश को समान होने के लिए बाध्य कर सकते हैं। ।
ऐसा लगता है कि प्रारंभिक लिंक मर चुका है। वेबसंग्रह