मैं इस सवाल के पार एक जवाब ठोकर खाई है, और अंततः, जबकि पूर्णांकों के साथ एक समान मुद्दा को देखकर। आखिरी उत्तर के बाद देरी के बावजूद, अगर मैं भविष्य में किसी और की मदद करता हूं तो मैं यहां जोड़ रहा हूं।
सबसे पहले अपने बुनियादी जवाब:
select xml.value('xs:decimal(sum(/List/value))', 'numeric') sum
from (select cast('<List><value>0</value><value>0</value></List>' as xml) xml) a
XQuery में आप एक मानक XML स्कीमा प्रकार है, जो तब SQL सर्वर द्वारा सही ढंग से नियंत्रित किया जाएगा करने के लिए मूल्य डाल सकता।
कृपया ध्यान दें: SQL सर्वर में डिफ़ॉल्ट "संख्यात्मक" में कोई दशमलव स्थान नहीं है ("0" का स्तर)!
अंत में, वास्तविक
select xml.value('xs:decimal(sum(/List/value))', 'numeric(20,5))') sum
from (select cast('<List><value>0</value><value>0</value></List>' as xml) xml) a
(आप Xml से दिए गए मान से सटीक या पैमाने अनुमान लगाने के लिए एसक्यूएल सर्वर नहीं मिल सकता है, आप स्पष्ट रूप से यह निर्दिष्ट करना होगा): आप शायद और अधिक की तरह कुछ क्या करने का इरादा मुद्दा यह है कि मैं व्यक्तिगत रूप से पता करने के लिए आवश्यक है, लगभग ठीक उसी था सिवाय मैं पूर्णांकों, जो भी "0" double
मूल्यों की एक्सएमएल प्रतिनिधित्व के साथ संघर्ष के साथ काम कर रहा था:
select xml.value('xs:int(sum(/List/value))', 'int') sum
from (select cast('<List><value>0</value><value>0</value></List>' as xml) xml) a
अद्यतन: मैंने पोस्ट किए गए दशमलव-हैंडलिंग समाधान के साथ समस्या (एसक्यूएल में दशमलव को परिवर्तित करने से पहले XQuery में दशमलव में कनवर्ट करना) यह है कि एकत्रीकरण वास्तव में (अनुमानित/अनुमानित) फ़्लोटिंग पॉइंट (डबल) डेटा प्रकार के साथ होता है। यदि आपके एक्सएमएल में आपके द्वारा संग्रहीत मानों की उच्च परिशुद्धता की आवश्यकता होती है, तो यह वास्तव में गलत काम हो सकता है - फ़्लोटिंग-पॉइंट एग्रीगेशन वास्तव में डेटा की हानि का परिणाम हो सकता है।
select xml.value('xs:decimal(sum(/List/value))', 'numeric(28, 0)') sum
from (select cast('<List>
<value>1000000000000000000000000001</value>
<value>1000000000000000000000000001</value>
</List>' as xml) xml) a
("2000000000000000000000000000" करने के लिए बाहर आता है, जो गलत है)
यह समस्या समान रूप से इस तरह के स्पष्ट रूप से के रूप में यहाँ की पेशकश की अन्य तरीकों, पर लागू होता है: यहाँ ईजी हम नंबर हम संक्षेप रहे हैं की पिछले अंक खोना मूल्य को टी-एसक्यूएल में "फ्लोट" के रूप में पढ़ना।
इससे बचने के लिए, डेटा प्रकार को एग्रीगेशन ऑपरेशन से पहले सेट करने के लिए XQuery FLWOR अभिव्यक्ति का उपयोग करके अंतिम विकल्प यहां दिया गया है। इस मामले में, एकत्रीकरण सही ढंग से होता है, और हम सही अभिव्यक्त मूल्य (करते हुए भी "0" मूल्यों यदि/जब वे होते हैं निपटने):
select xml.value('sum(for $r in /List/value return xs:decimal($r))', 'numeric(28, 0)') sum
from (select cast('<List>
<value>1000000000000000000000000001</value>
<value>1000000000000000000000000001</value>
</List>' as xml) xml) a
("2000000000000000000000000002" करने के लिए बाहर आता है, सही मान)
ऐसा लगता है कि राशि (/ सूची/मान) एक फ्लोट "0.0E0" लौटाती है जब योग शून्य होता है और उस संख्या को संख्यात्मक रूप में परिवर्तित नहीं किया जा सकता है। कोई विचार क्यों मैं इस व्यवहार को देखता हूं? –