आपका एक्सएमएल डेटा अधूरा है - यह एक नाम स्थान उपसर्ग का उपयोग करता है ns0
इसे कहीं भी परिभाषित किए बिना... मैंने अपने नमूने में कुछ मनमाना, पूरी तरह से बना हुआ एक्सएमएल नेमस्पेस यहां जोड़ा है - आपको यह जांचना होगा कि आपके मामले में एक्सएमएल नेमस्पेस वास्तव में क्या है और तदनुसार नमूना अनुकूलित करें!
इसे आजमाएं:
DECLARE @InputTable TABLE (ID INT NOT NULL, XmlData XML)
INSERT INTO @InputTable(ID, XmlData) VALUES(42, '<?xml version="1.0" encoding="UTF-8" ?>
<ns0:Root xmlns:ns0="urn:some-sample-xml-namespace">
<ns0:Result>
<ns0:AStatus>Aaa</ns0:AStatus>
<ns0:BStatus>Bbb</ns0:BStatus>
</ns0:Result>
</ns0:Root>')
-- define the XML namespace to use
;WITH XMLNAMESPACES('urn:some-sample-xml-namespace' AS x)
SELECT
ID,
XC.value('(x:AStatus)[1]', 'varchar(50)')
FROM
@inputtable
CROSS APPLY
-- get a "pseudo" table of nodes <ns0:Root>/<ns0:Result>
XmlData.nodes('x:Root/x:Result') AS XT(XC)
मूल रूप से, आपके पास एक परिभाषा . होनी चाहिए आपके एक्सएमएल नेमस्पेस प्रीफ़िक्स के लिए - और SELECT
. में इस XML डेटा के विरुद्ध, आपके पास समान . होना चाहिए एक्सएमएल नेमस्पेस (भले ही - जैसा दिखाया गया है - उस नेमस्पेस को दिया गया उपसर्ग अलग हो सकता है - लेकिन नेमस्पेस मेल खाना चाहिए!)।
यह तब तालिका से डेटा का चयन करता है, और XML डेटा के लिए, यह .nodes()
का उपयोग करता है XQuery इस XPath अभिव्यक्ति से मेल खाने वाले XML तत्व की सूची प्राप्त करने के लिए कार्य करता है - और यह इन नोड्स को इन-मेमोरी छद्म तालिका XT
के रूप में प्राप्त करता है एक एक्सएमएल कॉलम के साथ XC
जिससे आप फिर से मान प्राप्त कर सकते हैं (जैसे पहले <ns:AStatus>
. तक पहुंचना तत्व)।