2013-06-26 13 views
5

Ich versuche, XML abzufragen, während Namespaces ignoriert werden, da das Resultset mehrere Namespaces hat. Ich bin zu dem DataSets-Knoten gelangt, aber ich kann nicht herausfinden, wie man den multiplen DataSourceName/CommandType/CommandText herausholt. Idealerweise möchte ich:XML abfragen, während Namespace ignoriert wird?

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

Hilfe sehr geschätzt.

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

Ist Ihr DBMS Oracle? –

+0

Ich habe deinen Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

@JohnSaunders in Ordnung. Vielen Dank. – mbourgon

Antwort

9

Verwenden nodes() Method (xml Data Type) yoru XML Reihen zu zerkleinern und verwenden value() Method (xml Data Type) bestimmte Werte aus dem XML zu erhalten.

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

funktioniert wie ein Charme! Ich dachte mir, dass ich das Kreuz anwenden müsste, aber ich konnte das Kolon-Syntax-Zeug nicht herausfinden. Sehr geschätzt! – mbourgon

0

Wie wäre es (nicht getestet) ....

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, das hat nicht funktioniert - brauchte Singletons. Aber IIRC Ich habe es so versucht, und es hat wegen der Namespaces nicht funktioniert. – mbourgon

Verwandte Themen