2012-03-14 10 views
6

मेरे पास SQL ​​सर्वर में एक तालिका है जिसमें कॉलम में से एक XML डेटाटाइप है। तालिका में अन्य कॉलम हैं जो एक्सएमएल नहीं हैं। यहाँ एक्सएमएल उस कॉलम में संग्रहीत किया जाता है का एक उदाहरण है:एसक्यूएल सर्वर 2008 में XML डेटा प्रकार क्वेरी

<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 

क्या मैं चाहता हूँ एक प्रश्न है कि तालिका में अन्य स्तंभों पर और उन स्तंभों से मेल खाने वाले के लिए कुछ मूल्यों से मेल खाता है, मैं प्राप्त करना चाहते हैं प्रश्न नोड से टेक्स्ट विशेषता और नियंत्रण नोड से उत्तर विशेषता। क्या कोई इस में मेरी मदद कर सकता है?

संपादित

क्या परिवर्तित करने की है, तो मैं एक से अधिक समूह नोड है जरूरत है? इस scenerio में, मैं प्रत्येक प्रश्न के पाठ और प्रत्येक प्रश्न के साथ जाने का जवाब चाहते हैं। नीचे देखें:

<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
    <Group> 
    <Question text="Do You Have Asthma?:" ForeColor="Black" /> 
    <Controls> 
     <Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
     <Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
+2

इस पर एक अच्छा दृश्य प्रदान करें: http://msdn.microsoft.com/en-us/library/ms178030.aspx – RThomas

उत्तर

6
declare @T table 
(
    XMLCol xml 
) 

insert into @T values 
('<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black"/> 
     <Control type="TextBox" id="txtActScore" Answer="Answer" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
') 

select XMLCol.value(N'(/AdultAsthma/Group/Question/@text)[1]', 'nvarchar(max)'), 
     XMLCol.value(N'(/AdultAsthma/Group/Controls/Control/@Answer)[1]', 'nvarchar(max)') 
from @T 

अद्यतन:

आप .nodes() एक cross apply में उपयोग कर सकते हैं जब आप एकाधिक पंक्तियों में अपने एक्सएमएल टुकड़े टुकड़े करने की जरूरत है।

declare @T table 
(
    XMLCol xml 
) 

insert into @T values 
('<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
    <Group> 
    <Question text="Do You Have Asthma?:" ForeColor="Black" /> 
    <Controls> 
     <Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
     <Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
') 

select X.N.value(N'(Question/@text)[1]', 'nvarchar(max)'), 
     X.N.value(N'(Controls/Control/@Answer)[1]', 'nvarchar(max)') 
from @T as T 
    cross apply T.XMLCol.nodes(N'/AdultAsthma/Group') as X(N) 
+0

इस महान काम करता है! यदि AdultAsthma नोड के तहत मेरे पास एकाधिक समूह नोड्स हैं तो मुझे क्या बदलना चाहिए? मेरा संपादन देखें। –

+0

यह बहुत अच्छा है! धन्यवाद आदमी, यह वही है जो मुझे चाहिए! –

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