2011-11-08 20 views
5

वांछित लेआउट (नीचे) के अनुसार SQL सर्वर तालिका में निम्न XML ब्लॉक को पार्स करने का सही तरीका क्या होगा? क्या यूनियन या लूप के बिना, एक ही चयन कथन के साथ ऐसा करना संभव है? कोई लेने वाला? अग्रिम में धन्यवाद। इनपुट एक्सएमएल:एसक्यूएल तालिका में नेस्टेड एक्सएमएल को पार्सिंग

<ObjectData> 
    <Parameter1>some value</Parameter1> 
    <Parameter2>other value</Parameter2> 
    <Dates> 
    <dateTime>2011-02-01T00:00:00</dateTime> 
    <dateTime>2011-03-01T00:00:00</dateTime> 
    <dateTime>2011-04-01T00:00:00</dateTime> 
    </Dates> 
    <Values> 
    <double>0.019974</double> 
    <double>0.005395</double> 
    <double>0.004854</double> 
    </Values> 
    <Description> 
    <string>this is row 1</string> 
    <string>this is row 2</string> 
    <string>this is row 3</string> 
    </Values> 
</ObjectData> 

वांछित तालिका उत्पादन:

Parameter1 Parameter2  Dates    Values  Description 

Some value Other value 2011-02-01 00:00:00.0 0.019974 this is row 1 
Some value Other value 2011-03-01 00:00:00.0 0.005395 this is row 2 
Some value Other value 2011-04-01 00:00:00.0 0.004854 this is row 3 

मैं एक का चयन करें SQL विवरण OPENXML या xml.nodes() कार्यक्षमता का उपयोग करने के बाद कर रहा हूँ। उदाहरण के लिए, निम्नलिखित चयन विवरण मूल्यों और तिथियों के बीच उत्पादन में परिणाम (जो मानों और तिथियों के सभी क्रमिक क्रम है), जो कुछ मैं टालना चाहता हूं।

SELECT 
doc.col.value('Parameter1[1]', 'varchar(20)') Parameter1, 
doc.col.value('Parameter2[1]', 'varchar(20)') Parameter2, 
doc1.col.value('.', 'datetime') Dates , 
doc2.col.value('.', 'float') [Values] 
FROM 
@xml.nodes('/ObjectData') doc(col), 
@xml.nodes('/ObjectData/Dates/dateTime') doc1(col), 
@xml.nodes('/ObjectData/Values/double') doc2(col); 

उत्तर

7

आप बाल तत्वों से पहली, दूसरी, तीसरी आदि पंक्ति चुनने के लिए संख्या तालिका का उपयोग कर सकते हैं। इस क्वेरी में मैंने प्रदान की गई तिथियों को संख्या में वापस पंक्तियों तक सीमित कर दिया है। यदि तिथियों की तुलना में अधिक मूल्य या विवरण हैं तो आपको खाते में इसे लेने के लिए संशोधित करना होगा।

declare @XML xml = ' 
<ObjectData> 
    <Parameter1>some value</Parameter1> 
    <Parameter2>other value</Parameter2> 
    <Dates> 
    <dateTime>2011-02-01T00:00:00</dateTime> 
    <dateTime>2011-03-01T00:00:00</dateTime> 
    <dateTime>2011-04-01T00:00:00</dateTime> 
    </Dates> 
    <Values> 
    <double>0.019974</double> 
    <double>0.005395</double> 
    <double>0.004854</double> 
    </Values> 
    <Description> 
    <string>this is row 1</string> 
    <string>this is row 2</string> 
    <string>this is row 3</string> 
    </Description> 
</ObjectData>' 

;with Numbers as 
(
    select number 
    from master..spt_values 
    where type = 'P' 
) 
select T.N.value('Parameter1[1]', 'varchar(50)') as Parameter1, 
     T.N.value('Parameter2[1]', 'varchar(50)') as Parameter2, 
     T.N.value('(Dates/dateTime[position()=sql:column("N.Number")])[1]', 'datetime') as Dates, 
     T.N.value('(Values/double[position()=sql:column("N.Number")])[1]', 'float') as [Values], 
     T.N.value('(Description/string[position()=sql:column("N.Number")])[1]', 'varchar(max)') as [Description] 
from @XML.nodes('/ObjectData') as T(N) 
    cross join Numbers as N 
where N.number between 1 and (T.N.value('count(Dates/dateTime)', 'int')) 
+0

बहुत धन्यवाद, माइकल। यह वास्तव में अच्छी तरह से काम करता है! सिंटेक्स अभी भी दिमागी दबदबा है, मैंने कल्पना की कि यह थोड़ा आसान हो ... :) – Puzzled

-1

आमतौर पर, यदि आप XML को पार्स करना चाहता था, आप इसे पर्ल, पायथन, जावा या सी # है कि एक) एक XML डोम है, और ख) एक संबंधपरक डेटाबेस के साथ संवाद कर सकते हैं की तरह एक प्रोग्रामिंग भाषा करना चाहते हैं।

यहाँ एक संक्षिप्त लेख है कि आप पढ़ने और एक्सएमएल लेखन की मूल बातें में से कुछ पता चलता सी # में है ... और यहां तक ​​कि कैसे एक SQL क्वेरी से एक XML दस्तावेज बनाने के लिए का एक उदाहरण है (एक पंक्ति में!):

http://www.c-sharpcorner.com/uploadfile/mahesh/readwritexmltutmellli2111282005041517am/readwritexmltutmellli21.aspx

+0

धन्यवाद, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं OPENXML या xml.nodes() कार्यक्षमता का उपयोग कर SQL कथन के बाद हूं। निम्नलिखित चयन कथन के परिणाम मूल्यों और तिथियों के बीच उत्पादन में होते हैं, जो कुछ मैं टालना चाहता हूं। चुनें doc.col.value ('पैरामीटर 1 [1]', 'वर्चर (20)') पैरामीटर 1, doc.col.value ('पैरामीटर 2 [1]', 'वर्कर (20)') पैरामीटर 2, doc1 .col.value ('।', 'डेटाटाइम') दिनांक , doc2.col.value ('। [1]', 'float') [मान] @ xml.nodes ('/ ObjectData') दस्तावेज़ से (कोल) , @ xml.nodes ('/ ऑब्जेक्टडेटा/तिथियां/डेटटाइम') doc1 (col) , @ xml.nodes ('/ ObjectData/Values ​​/ double') doc2 (col); – Puzzled

2

OPENXML फ़ंक्शन का उपयोग करें।

INSERT INTO table SELECT * FROM OPENXML(source, rowpattern, flags) 

कृपया स्पष्टता के लिए प्रलेखन कड़ी में पहला उदाहरण देखें: यह एक rowset प्रदाता (यह एक्सएमएल से पार्स पंक्तियों के सेट देता है) और इस प्रकार का चयन में उपयोग किया जा सकता है या जैसे INSERT है।

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