2013-06-26 31 views
5

Tôi đang cố truy vấn XML trong khi bỏ qua các không gian tên, bởi vì tập hợp kết quả có nhiều không gian tên. Tôi đã nhận được vào nút DataSets, nhưng tôi không thể tìm ra cách để có được nhiều DataSourceName/CommandType/CommandText. Lý tưởng nhất là tôi muốn:XML truy vấn trong khi bỏ qua không gian tên?

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

Giúp đánh giá cao.

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

là DBMS Oracle của bạn? –

+0

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

+0

@JohnSaunders okay. Cảm ơn. – mbourgon

Trả lời

9

Sử dụng nodes() Method (xml Data Type) băm nhỏ yoru XML để hàng và sử dụng value() Method (xml Data Type) để có được giá trị cụ thể từ 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

hoạt động như một sự quyến rũ! Tôi nghĩ rằng tôi sẽ cần thập giá áp dụng, nhưng không thể tìm ra các công cụ cú pháp đại tràng. Nhiều đánh giá cao! – mbourgon

0

Làm thế nào về (chưa được kiểm tra) ....

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, không hoạt động - những người độc thân cần thiết. Nhưng IIRC tôi đã thử cách đó, và nó không hoạt động vì không gian tên. – mbourgon

Các vấn đề liên quan