2013-06-26 146 views
5

我試圖在忽略名稱空間的同時查詢XML,因爲結果集有多個名稱空間。我已經到了DataSets節點,但我無法弄清楚如何離開多個DataSourceName/CommandType/CommandText。理想情況下,我想:查詢XML而忽略名稱空間?

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

是您的DBMS的Oracle? –

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@JohnSaunders好吧。謝謝。 – mbourgon

回答

9

使用nodes() Method (xml Data Type)切碎夜XML行和使用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

怎麼樣(未經測試)....

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,沒有工作 - 需要單身。但是IIRC我嘗試了這種方式,並且因爲命名空間而不起作用。 – mbourgon