यदि आपको संदेश के साथ SQL सर्वर त्रुटि Msg 8117 मिल रही है संचालन डेटा प्रकार varchar योग ऑपरेटर के लिए अमान्य है , ऐसा इसलिए है क्योंकि आप किसी ऑपरेटर या फ़ंक्शन को गलत डेटा प्रकार पास कर रहे हैं।
इस मामले में, त्रुटि इंगित करती है कि हम SUM()
. पर एक स्ट्रिंग पास कर रहे हैं समारोह। Tवह SUM()
फ़ंक्शन स्ट्रिंग्स पर काम नहीं करता है। यह केवल संख्यात्मक प्रकारों पर काम करता है।
वही त्रुटि (संदेश 8117) अन्य संदर्भों में भी हो सकती है - यह SUM()
तक सीमित नहीं है समारोह।
त्रुटि का उदाहरण
यहां कोड का एक उदाहरण दिया गया है जो त्रुटि उत्पन्न करता है:
SELECT SUM(ProductName)
FROM Products;
परिणाम:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
इस मामले में, हम ProductName
. को जोड़ने का प्रयास कर रहे हैं कॉलम।
इस मामले में, इसकी अत्यधिक संभावना है कि ProductName
कॉलम एक varchar
है कॉलम। हमें शायद गलत कॉलम मिला है।
समाधान 1
इस त्रुटि को ठीक करने के लिए, हमें पहले जांचना चाहिए कि हमें सही कॉलम मिला है। अगर हमारे पास सही कॉलम नहीं है, तो इसे सही कॉलम में बदलें:
SELECT SUM(Price)
FROM Products;
उम्मीद है कि यह इस मुद्दे को हल करता है। दूसरे शब्दों में, उम्मीद है कि Price
कॉलम संख्यात्मक है, जैसा होना चाहिए।
लेकिन अगर ऐसा नहीं है तो क्या होगा?
समाधान 2
कुछ मामलों में आप पा सकते हैं कि आपके पास सही कॉलम है, लेकिन वह कॉलम अनुचित डेटा प्रकार का उपयोग करता है। उदाहरण के लिए, मान लें कि हमारा Price
कॉलम को वास्तव में varchar
. के रूप में परिभाषित किया गया था कॉलम।
उस स्थिति में, हमें वही त्रुटि मिलेगी:
SELECT SUM(Price)
FROM Products;
परिणाम:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
पहली नज़र में, इस कथन में कुछ भी गलत नहीं लगता है। हम केवल Price
. में कुल मान प्राप्त कर रहे हैं कॉलम। यह SUM()
. क्या है इसका एक आदर्श उदाहरण है कार्य करने के लिए डिज़ाइन किया गया था।
बेशक, यहाँ धारणा यह है कि Price
कॉलम संख्यात्मक है। लेकिन त्रुटि संदेश के अनुसार, यह संख्यात्मक नहीं है - यह एक varchar
है ।
आइए कॉलम के डेटा प्रकार की जाँच करें:
SELECT
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH AS MAX_LENGTH,
CHARACTER_OCTET_LENGTH AS OCTET_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Products'
AND COLUMN_NAME = 'Price';
परिणाम:
+-------------+--------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH | |-------------+--------------+----------------| | varchar | 255 | 255 | +-------------+--------------+----------------+
जैसा कि संदेह है, कॉलम varchar
. प्रकार का है ।
इस मामले में, हमारे पास दो विकल्प हैं; कॉलम के प्रकार को बदलें, या इसके योग को प्राप्त करते समय इसके प्रकार को फ्लाई पर परिवर्तित करें।
आइए इसके प्रकार को मक्खी पर रूपांतरित करें:
SELECT SUM(CAST(Price AS decimal(8,2)))
FROM Products;
परिणाम:
48.25
यह सौभाग्य से काम कर गया।
इस मामले में, Price
. में सभी डेटा कॉलम को एक संख्यात्मक प्रकार में परिवर्तित किया जा सकता है।
यदि आपको त्रुटि संदेश 8114 मिलता है जो कुछ इस तरह पढ़ता है डेटा प्रकार varchar को संख्यात्मक में कनवर्ट करने में त्रुटि , तो इसका मतलब है कि कॉलम में डेटा है जिसे संख्यात्मक में परिवर्तित नहीं किया जा सकता है।
त्रुटि यह दिखती है:
Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to numeric.
इस मामले में, आपको गैर-संख्यात्मक डेटा ढूंढना होगा और यह तय करना होगा कि इसके साथ क्या करना है।
यहां बताया गया है कि हम गैर-संख्यात्मक मान कैसे ढूंढ सकते हैं:
SELECT Price
FROM Products
WHERE ISNUMERIC(Price) <> 1;
परिणाम:
+-------------+ | Price | |-------------| | Ten dollars | | Fifteen | +-------------+
हमें अपराधी मिल गए हैं!
जब तक कोई अच्छा कारण न हो, हमें उन मानों को उनके संख्यात्मक समकक्षों में बदल देना चाहिए।
उसके बाद, हमें कॉलम के डेटा प्रकार को बदलने पर विचार करना चाहिए, ताकि भविष्य में इस प्रकार के डेटा को सम्मिलित नहीं किया जा सके। ऐसा करने से डेटा अखंडता को लागू करने में मदद मिलेगी।
ISNUMERIC()
. का उपयोग करते समय एक बात का ध्यान रखना चाहिए कार्य यह है कि यह कभी-कभी झूठी सकारात्मक लौटा सकता है। मेरा मतलब यह है कि कुछ गैर-संख्यात्मक वर्ण हैं जिनकी व्याख्या संख्यात्मक के रूप में की जाती है। गैर-संख्या वर्ण देखें जो ISNUMERIC()
. का उपयोग करते समय सकारात्मक लौटते हैं इसके बारे में अधिक जानकारी के लिए।