2009-08-19 7 views
31

मेरे पास टेक्स्ट के रूप में संग्रहीत एक टाइप किया गया XML दस्तावेज़ है। इसलिए मैं एक्सएमएल तरीकों का उपयोग करने में सक्षम होने के लिए एक आम तालिका अभिव्यक्ति का उपयोग करके एक्सएमएल के लिए डेटा प्रकार परिवर्तित का उपयोग करें:एक्सएमएल क्वेरी() काम करता है, वैल्यू() को सिंगलटन की आवश्यकता होती है xdt: untypedAtomic

WITH xoutput AS (
    SELECT CONVERT(xml, t.requestpayload) 'requestpayload' 
    FROM TABLE t 
    WHERE t.methodid = 1) 
SELECT x.requestpayload.query('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id') as studentid 
    FROM xoutput x 

क्वेरी, काम करता है मेरे लिए तत्व लौटने। लेकिन मैं केवल मूल्य में दिलचस्पी रखता हूँ:

WITH xoutput AS (
    SELECT CONVERT(xml, t.requestpayload) 'requestpayload' 
    FROM TABLE t 
    WHERE t.methodid = 1) 
SELECT x.requestpayload.value('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id', 'int') as studentid 
    FROM xoutput x 

यह मैं निम्न त्रुटि देता है:

'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

क्या मैं googled है कि XPATH/XQuery कोष्ठक के अंदर होने की जरूरत है कहते हैं और/या जरूरत है "[1]" - न तो काम किया है। एक्सएमएल में केवल एक छात्र-आईडी तत्व है, हालांकि मुझे लगता है कि स्कीमा अधिक के लिए अनुमति देता है?

इसके अतिरिक्त, कई तत्व मान हैं जिन्हें मैं पुनर्प्राप्त करना चाहता हूं - क्या प्रति विधि कॉल के बजाय नामस्थान घोषित करने का कोई तरीका है?

उत्तर

62

आप इस का उपयोग करने की आवश्यकता है:

SELECT 
     x.requestpayload.value('declare namespace s="http://blah.ca/api"; 
      (/s:validate-student-request/s:student-id)[1]', 'int') 
    AS 
     studentid 
    FROM 
     xoutput x

आप (...) में अपने XPath रख दिया और एक [1] बस उस अनुक्रम के पहले मूल्य का चयन करने के जोड़ने की जरूरत है।

7

मेरा मानना ​​है कि यह हो सकता है भी कार्य करें:

SELECT 
    x.requestpayload.query('declare namespace s="http://blah.ca/api"; 
          /s:validate-student-request/s:student-id').value('.', 'int') 
    as studentid 
FROM xoutput x 
3

प्रदर्शन में रुचि रखने वालों मैं इन तरीकों और साथ पहला विकल्प की तुलना करने के एक प्रश्न भाग गया के लिए "() और जोड़ने के एक [1]" था की तुलना में बहुत तेजी से ".query ('strFranchise')। मूल्य ('।', ...)"।

निष्पादन योजना में अंतर 15% से 85% था जब एक ही डेटा पर एक के बाद एक चल रहा था। तो() [1] 5 गुना तेज है! निष्पादन योजना बहुत अलग है।

+0

जैसा कि मैं इसे समझता हूं '[1]' केवल पहला परिणाम देता है जबकि '.value ('।' 'सभी परिणाम देता है। –

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