5

MSDN के अनुसार, वास्तविक मूल्यों की सीमा - 3.40E + 38 से -1.18E - 38, 0 और 1.18E - 38 से 3.40E + 38 है। हालांकि, मेरे पास काफी मेरी तालिका में उस सीमा से परे कुछ मूल्य।दस्तावेज श्रेणी के बाहर वास्तविक कॉलम होल्डिंग मान

निम्न क्वेरी और बहुत छोटे मान के बहुत सारे कोई बहुत बड़ी वाले रिटर्न:

SELECT MyColumn , 
     * 
FROM data.MyTable 
WHERE MyColumn <> 0 
     AND (MyColumn < CONVERT(REAL, 1.18E-38) 
       OR MyColumn > CONVERT(REAL, 3.40E+38) 
      ) 
     AND (MyColumn < CONVERT(REAL, -3.40E+38) 
       OR MyColumn > CONVERT(REAL, -1.18E-38) 
      ) 

यह दिखाने के लिए कि कैसे इन मूल्यों को तालिका में अंत में आसान है। मैं उन्हें सीधे सम्मिलित कर सकते हैं नहीं:

CREATE TABLE a(r REAL NULL); 
GO 
INSERT INTO a(r) VALUES(4.330473E-39); 
GO 
SELECT r FROM a 
GO 
DROP TABLE a; 

---- 
0.0 

लेकिन मैं दो कॉलम विभाजित और हो और सीमा मूल्य के बाहर कर सकते हैं:

CREATE TABLE a 
    (
    r1 REAL NULL , 
    r2 REAL NULL , 
    r3 REAL NULL 
) ; 
GO 
INSERT INTO a 
     (r1, r2) 
VALUES (4.330473E-38, 1000) ; 
GO 
UPDATE a 
SET  r3 = r1/r2 ; 
SELECT r1 , 
     r2 , 
     r3 
FROM a 

r1   r2   r3 
------------- ------------- ------------- 
4.330473E-38 1000   4.330433E-41 

तो मैं MSDN मान्य डेटा के गलत पर्वतमाला देता है लगता है, सही है? क्या मुझे कुछ याद आ रही है?

कई लोगों ने सुझाव दिया कि यह एक बग है।

इस व्यवहार का कौन सा हिस्सा बिल्कुल एक बग है। यह है:

  1. एमएसडीएन में प्रयुक्त गलत स्थिरांक और डीबीसीसी में उपयोग किया जाता है, साथ ही गोल करने के लिए गलत सीमा भी होती है।
  2. अद्यतन गलत मूल्यों
+0

एक बग की तरह लगता है, आप अपने पसंदीदा जगह में यह दायर किया है? मुझे लगता है कि आप अपनी खुद की बाधा को 'चेक (आर 3> 3.40 ई -38)' :-) –

+0

@AaronBertrand में जोड़ सकते हैं, मैं निश्चित रूप से एक बाधा डाल सकता हूं, लेकिन मैं समझना चाहता हूं कि क्यों SQL सर्वर दस्तावेज़ के रूप में व्यवहार नहीं करता है। –

+3

'dbcc checktable ('a') DATA_PURITY' के साथ: कॉलम" r3 "मान डेटा प्रकार" वास्तविक "के लिए सीमा से बाहर है। कॉलम को कानूनी मान पर अपडेट करें। इसकी रिपोर्ट करें ... –

उत्तर

7

पुस्तकें ऑनलाइन दस्तावेज़ केवल एकल-और डबल-परिशुद्धता फ़्लोटिंग पॉइंट संख्याओं के लिए सामान्य श्रेणी है। IEEE 754 नियम छोटे-छोटे गैर-शून्य सामान्य मान से शून्य के करीब फ़्लोटिंग-पॉइंट संख्या निर्दिष्ट करते हैं, जिन्हें denormalized, denormal, and subnormal संख्याओं के रूप में जाना जाता है। उस अंतिम लिंक से:

डेनोर्मल नंबर गारंटी प्रदान करते हैं कि फ़्लोटिंग-पॉइंट संख्याओं के अतिरिक्त और घटाव कभी भी बहते नहीं हैं; दो पास के फ्लोटिंग-पॉइंट संख्याओं में हमेशा एक प्रतिनिधित्व करने योग्य गैर-शून्य अंतर होता है। क्रमिक अंडरफ्लो के बिना, घटाव ए-बी अंडरफ्लो कर सकता है और शून्य उत्पन्न कर सकता है भले ही मान बराबर न हों। यह बदले में विभाजन को शून्य त्रुटियों से ले सकता है जो तब नहीं हो सकता है जब क्रमिक अंडरफ्लो उपयोग किया जाता है।

SQL सर्वर single-precision floating point पोस्ट किए गए उदाहरणों में गणनाओं के नियमों का पालन कर रहा है। बग यह हो सकता है कि डीबीसीसी केवल सामान्य मानों के लिए जांच करता है, और एक गलत त्रुटि संदेश फेंकता है जब यह एक संग्रहित denormal मान का सामना करता है।

उदाहरण उत्पादन एक denormal एकल परिशुद्धता मूल्य:

DECLARE 
    @v1 real = 14e-39, 
    @v2 real = 1e+07; 

-- 1.4013e-045 
SELECT @v1/@v2; 

उदाहरण एक संग्रहीत float denormal दिखा बी सी सी जांच में सफल:

CREATE TABLE dbo.b (v1 float PRIMARY KEY); 
INSERT b VALUES (POWER(2e0, -1075)); 
SELECT v1 FROM b; -- 4.94065645841247E-324 
DBCC CHECKTABLE(b) WITH DATA_PURITY; -- No errors or warnings 
DROP TABLE dbo.b; 
+4

बग का कौन सा हिस्सा SQL सर्वर प्रोग्रामर के * इरादे * पर निर्भर करता है। यह प्रलेखन (और 'डीबीसीसी चेकडबीबी') से दिखाई देता है, कि * इरादा * केवल सामान्यीकृत संख्याओं को स्टोर करना था। –

+2

@Damien_The_Unbeliever शायद, लेकिन अगर वह * इरादा * था तो क्या यह उत्सुक नहीं है कि 'CHECKDB' असामान्य फ्लोट डेटा पर ऑब्जेक्ट नहीं करता है? 'तालिका बी बनाओ (v1 फ्लोट); इंसर्ट बी वैल्यूज (पावर (2e0, -1075)); बी से चुनें v1; डीबीसीसी चैकटेबल (बी) डाटाएरिटी के साथ; '। –

+0

दरअसल, यह साबित करता है कि 'डीबीसीसी चैकडबीबी 'में एक बग है। उत्पाद टीम द्वारा डिजाइन किए गए निर्णय के निर्णय के आधार पर, असामान्य फ्लोट स्टोर करने में सक्षम होना संभवतः हो सकता है या नहीं। +1 – usr

0

इस को बचाने के लिए सक्षम किया जा रहा एसक्यूएल सर्वर में एक बग है। आपके द्वारा पोस्ट की गई अंतिम स्क्रिप्ट एक अच्छा रेपो है। अंत में इसे करने के लिए एक पंक्ति जोड़ें:

DBCC CHECKDB WITH data_purity 

इस के साथ विफल:

संदेश 2570, स्तर 16, राज्य 3, पंक्ति 1 पृष्ठ (1: 313), में ऑब्जेक्ट ID स्लॉट 0 357576312, इंडेक्स आईडी 0, विभाजन आईडी 1801439851932155904, ऑलोक यूनिट आईडी 2017612634169999360 ("इन-पंक्ति डेटा" टाइप करें)। कॉलम "आर 3" मान डेटा प्रकार "असली" के लिए रेंज से बाहर है। कॉलम को कानूनी मान पर अपडेट करें।

यह साबित करता है कि यह एक बग है। मेरा सुझाव है कि आप Microsoft Connect for SQL Server के साथ एक बग फ़ाइल करें।

+0

+1, लेकिन: इस व्यवहार का कौन सा हिस्सा बिल्कुल एक बग है। यह है: 1. एमएसडीएन में प्रयुक्त गलत स्थिरांक और डीबीसीसी में उपयोग किया जाता है, साथ ही साथ गोल करने के लिए गलत सीमा भी होती है। 2. गलत मानों को सहेजने में सक्षम होने के अपडेट –

+0

@AlexKuznetsov, नहीं। 2 बग है: http://www.sqlskills.com/BLOGS/PAUL/post/CHECKDB- से- प्रत्येक- कोण- कैसे-to-tell-if-data-purity-checks-will-be-run.aspx ("2005 से पहले SQL सर्वर संस्करणों में, डेटाबेस में अमान्य डेटा मान आयात करना संभव था। ये अमान्य मान क्वेरी निष्पादन समस्याओं, या संभवतः यहां तक ​​कि गलत परिणाम भी पैदा कर सकते हैं। 2005 में, जब आयात 'छेद' बंद थे") । वे * बंद होना चाहिए। यह आधिकारिक दस्तावेज नहीं है लेकिन मुझे लगता है कि टीम इसे एक बग के रूप में मानेगी। – usr

+0

धन्यवाद! मैं यह सुनिश्चित कर दूंगा कि अनियंत्रित मान UPDATE/MERGE कमांड के माध्यम से सहेजे नहीं जाएंगे। –

संबंधित मुद्दे