2013-06-26 14 views
5

Próbuję wysłać zapytanie do XML podczas ignorowania przestrzeni nazw, ponieważ zestaw wyników ma wiele przestrzeni nazw. Dostałem się do węzła DataSets, ale nie mogę wymyślić, jak wydobyć wiele DataSourceName/CommandType/CommandText. Idealnie chcę:zapytanie XML podczas ignorowania przestrzeni nazw?

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

Pomoc bardzo doceniona.

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

Czy Twój DBMS Oracle? –

+0

Edytowałem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

+0

@JohnSaunders ok. Dzięki. – mbourgon

Odpowiedz

9

użytkowania nodes() Method (xml Data Type) strzępić yoru XML do wierszy i użyć value() Method (xml Data Type) uzyskać konkretne wartości z 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

działa jak urok! Pomyślałem, że będę potrzebował krzyża, ale nie mogłem wymyślić składni dwukropka. Bardzo doceniane! – mbourgon

0

Jak o (niesprawdzone) ....

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

FWIW, który nie działał - potrzebował singletonów. Ale IIRC próbowałem w ten sposób i nie działało z powodu przestrzeni nazw. – mbourgon

Powiązane problemy