2013-06-26 2 views
5

मैं नामस्थानों को अनदेखा करते समय एक्सएमएल से पूछताछ करने की कोशिश कर रहा हूं, क्योंकि परिणाम सेट में कई नामस्थान हैं। मैं डेटासेट नोड को प्राप्त कर चुका हूं, लेकिन मैं यह नहीं समझ सकता कि एकाधिक डेटासोर्सनाम/कमांड टाइप/कमांडटेक्स्ट कैसे प्राप्त करें। आदर्श रूप में मैं चाहता हूं:क्वेरी एक्सएमएल?

DataSetName DataSourceName CommandType  CommandText 
SQLDS   SQLDS   StoredProcedure ReportProc_aaaaa 
SQLDS   SQLDS   StoredProcedure ReportProc_lalala 

बहुत सराहना करने में सहायता करें।

DECLARE @xmltable TABLE (myxml XML) 
INSERT INTO @xmltable 
SELECT 
'<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"> 
    <DataSources> 
    <DataSource Name="SQLDS"> 
     <rd:DataSourceID>32e83b35-434d-4808-b685-ada14accd0e7</rd:DataSourceID> 
     <DataSourceReference>SQLDS</DataSourceReference> 
    </DataSource> 
    </DataSources> 
    <DataSets> 
    <DataSet Name="SQLDS"> 
     <Query> 
     <DataSourceName>SQLDS</DataSourceName> 
     <CommandType>StoredProcedure</CommandType> 
     <CommandText>ReportProc_ServerPerformanceGroup</CommandText> 
     </Query> 
    </DataSet> 
    <DataSet Name="GroupDetails"> 
     <Query> 
     <DataSourceName>SQLDS</DataSourceName> 
     <CommandType>StoredProcedure</CommandType> 
     <CommandText>ReportProc_lalala</CommandText> 
     </Query> 
    </DataSet> 
    </DataSets> 
</Report>' 

SELECT myxml.value('(/*:Report/*:DataSets)[1]','varchar(100)') FROM @xmltable 
+1

अपने डीबीएमएस ओरेकल है? –

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

@ जॉन सैंडर्स ठीक है। धन्यवाद। – mbourgon

उत्तर

9

उपयोग nodes() Method (xml Data Type) पंक्तियों को yoru एक्सएमएल चूरे और value() Method (xml Data Type) का उपयोग XML से विशिष्ट मान प्राप्त करने के लिए करने के लिए।

select T1.N.value('@Name', 'nvarchar(128)') as DataSetName, 
     T2.N.value('(*:DataSourceName/text())[1]', 'nvarchar(128)') as DataSourceName, 
     T2.N.value('(*:CommandType/text())[1]', 'nvarchar(128)') as CommandType, 
     T2.N.value('(*:CommandText/text())[1]', 'nvarchar(max)') as CommandText 
from @xmltable as T 
    cross apply T.myxml.nodes('/*:Report/*:DataSets/*:DataSet') as T1(N) 
    cross apply T1.N.nodes('*:Query') as T2(N) 

SQL Fiddle

+0

एक आकर्षण की तरह काम करता है! मुझे लगा कि मुझे क्रॉस लागू करने की आवश्यकता होगी, लेकिन कोलन सिंटैक्स सामान को समझ नहीं सका। बहुत सराहना की! – mbourgon

0

कैसे के बारे में (untested) ....

select 
    T.c.value(N'DataSourceName', N'nvarchar(100)') as DataSourceName, 
    T.c.value(N'CommandType',N'nvarchar(100)') as CommandType, 
    T.c.value(N'CommandText', N'nvarchar(100)') as CommandText 
    from 
    @myxml.nodes(N'/Report/DataSets/DataSet/Query') T(c) 
+0

एफडब्ल्यूआईडब्ल्यू, जो काम नहीं करता - आवश्यक सिंगलेट्स। लेकिन आईआईआरसी मैंने इस तरह से कोशिश की, और यह नामस्थानों के कारण काम नहीं किया। – mbourgon

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