Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में "अंकगणित अतिप्रवाह त्रुटि पहचान को डेटा प्रकार में परिवर्तित करना ..." को ठीक करें

यदि आपको त्रुटि मिल रही है “संदेश 8115, स्तर 16 अंकगणितीय अतिप्रवाह त्रुटि पहचान को डेटा प्रकार में परिवर्तित कर रही है… " SQL सर्वर में त्रुटि, यह शायद इसलिए है क्योंकि आप किसी तालिका में डेटा सम्मिलित करने का प्रयास कर रहे हैं जब उसकी IDENTITY कॉलम अपने डेटा प्रकार की सीमा तक पहुंच गया है।

एक IDENTITY कॉलम स्वचालित रूप से प्रत्येक नई पंक्ति के साथ डाले गए मान को बढ़ाता है। यदि डाला जा रहा मान कॉलम के डेटा प्रकार की सीमा से बाहर है, तो उपरोक्त त्रुटि होगी।

त्रुटि का उदाहरण

यहां कोड का एक उदाहरण दिया गया है जिसके परिणामस्वरूप त्रुटि होती है:

INSERT INTO t1 VALUES ('Dog');

परिणाम:

Msg 8115, Level 16, State 1, Line 1
Arithmetic overflow error converting IDENTITY to data type tinyint.

इस मामले में, मेरी IDENTITY कॉलम tinyint का उपयोग करता है डेटा प्रकार, जिसकी सीमा 0 से 255 तक है। त्रुटि का अर्थ है कि IDENTITY कॉलम 255 से अधिक मान डालने का प्रयास कर रहा है।

यह आमतौर पर तब होता है जब हम पहले ही कॉलम में 255 पंक्तियाँ सम्मिलित कर चुके होते हैं, और अब हम 256 वीं पंक्ति सम्मिलित करने का प्रयास कर रहे हैं।

जब मैं उन सभी पंक्तियों का चयन करता हूं, जहां IDENTITY . है, तो मेरी तालिका कैसी दिखती है कॉलम 250 . से बड़ा है :

SELECT * FROM t1
WHERE c1 > 250;

परिणाम:

+------+------+
| c1   | c2   |
|------+------|
| 251  | Ant  |
| 252  | Cow  |
| 253  | Bat  |
| 254  | Duck |
| 255  | Bull |
+------+------+

इस मामले में, c1 क्या मेरी IDENTITY है? कॉलम (जो कि टाइप होता है tinyint ) हम देख सकते हैं कि IDENTITY पहले उत्पन्न किया है 255 कॉलम के लिए, और इसलिए अगला मान जो सम्मिलित करने का प्रयास करता है वह है 256 (1 . का इंक्रीमेंट मान मानकर और पहले कोई असफल इंसर्ट नहीं)। यह उपरोक्त त्रुटि का कारण बनेगा, क्योंकि 256 एक tinyint . की सीमा से बाहर है ।

smallint . के डेटा प्रकारों के साथ भी यही समस्या हो सकती है (अधिकतम मूल्य 32,767) या int (अधिकतम मूल्य 2,147,483,647)। यह bigint . के साथ भी हो सकता है यदि आपने पर्याप्त पंक्तियां डाली हैं (9,223,372,036,854,775,807 से अधिक)।

हालांकि, IDENTITY मान हमेशा सम्मिलित पंक्तियों की संख्या से मेल नहीं खाता। IDENTITY . बनाते समय आप एक बीज मान सेट कर सकते हैं कॉलम, और आप एक वेतन वृद्धि मान भी सेट कर सकते हैं। इसलिए, आप बीज और वृद्धि मूल्यों के आधार पर टेबल पर किए गए इंसर्ट की संख्या की तुलना में बहुत पहले आसानी से ऊपरी सीमा तक पहुंच सकते हैं।

साथ ही, किसी तालिका से पंक्तियों को हटाने से IDENTITY को रीसेट नहीं किया जाता है value (हालांकि एक टेबल को छोटा करना करता है)।

इसलिए, आप तब भी उपरोक्त त्रुटि का अनुभव कर सकते हैं, जब तालिका में IDENTITY की तुलना में बहुत कम पंक्तियाँ हों कॉलम का डेटा प्रकार सुझा सकता है।

समाधान

एक समाधान IDENTITY के डेटा प्रकार को बदलना है कॉलम। उदाहरण के लिए, यदि यह smallint है , इसे int . में बदलें . या अगर यह पहले से ही int है , इसे bigint . में बदलें ।

एक अन्य संभावित समाधान IDENTITY को रीसेट करना होगा कम मूल्य पर बीज। यह तभी काम करेगा जब आपने टेबल से बहुत सारी पंक्तियों को हटा दिया हो, या यदि मूल बीज मान 1 से बहुत अधिक था .

उदाहरण के लिए, यदि IDENTITY कॉलम पहले से ही एक int है , लेकिन IDENTITY बीज की शुरुआत 2,000,000,000 . से हुई , आप IDENTITY . को रीसेट कर सकते हैं बीज से 1 , जो अन्य 2 अरब पंक्तियों को सम्मिलित करने की अनुमति देगा।

सहायक कार्य

यहां कुछ फ़ंक्शन दिए गए हैं जो इस समस्या की पहचान करने में बहुत मददगार हो सकते हैं:

  • IDENT_CURRENT() - किसी निर्दिष्ट तालिका या किसी पहचान कॉलम पर दृश्य के लिए उत्पन्न अंतिम पहचान मान लौटाता है।
  • @@IDENTITY - वर्तमान सत्र में पिछली बार डाला गया पहचान मान लौटाता है।
  • IDENT_SEED() - पहचान कॉलम का मूल बीज लौटाता है।
  • IDENT_INCR() - पहचान कॉलम का इंक्रीमेंट मान लौटाता है।

साथ ही, कॉलम का डेटा प्रकार प्राप्त करने के 3 तरीके यहां दिए गए हैं यदि आप सुनिश्चित नहीं हैं कि कॉलम का डेटा प्रकार क्या है।

विभिन्न परिदृश्यों में समान त्रुटि

वही त्रुटि (संदेश 8115) भी हो सकती है (थोड़ा अलग त्रुटि संदेश के साथ) जब आप डेटा प्रकारों के बीच स्पष्ट रूप से कनवर्ट करने का प्रयास करते हैं और मूल मान नए प्रकार की सीमा से बाहर होता है। इसे ठीक करने के लिए SQL सर्वर में "अंकगणित अतिप्रवाह त्रुटि को डेटा प्रकार संख्यात्मक में परिवर्तित करना" देखें।

यह तब भी हो सकता है जब आप SUM() . जैसे किसी फ़ंक्शन का उपयोग करते हैं एक कॉलम पर, और परिकलन के परिणामस्वरूप एक मान होता है जो कॉलम के प्रकार की सीमा से बाहर होता है। इसे ठीक करने के लिए SQL सर्वर में "अंकगणित अतिप्रवाह त्रुटि अभिव्यक्ति को डेटा प्रकार int में कनवर्ट करना" देखें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में DB_NAME () कैसे काम करता है

  2. विभिन्न सर्वरों पर दो डेटाबेस में दो तालिकाओं को जोड़कर डेटा की क्वेरी करना

  3. क्या मैं pyodbc और MS SQL सर्वर के साथ एक कनेक्शन पर एकाधिक कर्सर का उपयोग कर सकता हूं?

  4. TSQL में COALESCE फ़ंक्शन

  5. स्वचालित संस्करण संख्या .Dtsx फ़ाइलों से पुनर्प्राप्ति