2012-04-11 6 views
3

Ich muss XML-Daten abfragen, die mehrere REPORT-Tag-Elemente enthält. Es muss gefiltert werden, um nur die Zeilen zurückzugeben, in denen die REPORTID einem gegebenen Namen entspricht. Ich habe versucht, diesen Filter ohne Glück durchzuführen. Könnte mir jemand hier mit den SQL Server Xml Funktionen in die richtige Richtung zeigen?Sql Server Xml zu Tabellenlogik

Grundsätzlich suche ich meine Ergebnismenge als Tisch zurückzukehren und wie folgt aussehen:

ID 
------ 
1 
2 
3 

folgenden gegeben, wie würde ich auf die Zeilen für den Bericht auswählen, wo die ReportID (/ TEST/REPORT/TITLE [@ReportId = "Bericht Eins"]) ist gleich "Bericht Eins"?

DECLARE @Xml XML, @ReportId VARCHAR(200); 
SET @ReportId = 'Report One'; 

SET @Xml = ' 
<TEST> 
<REPORT ReportType="Type One"> 
    <TITLE ReportId="Report One"> 
    <TITLE1>Title One</TITLE1> 
    </TITLE> 
    <HEADER> 
    <Run_Date OrigName="Run Date">4/10/2012</Run_Date> 
    </HEADER> 
    <BODY> 
    <TABLE1> 
     <DATA /> 
     <ROW> 
     <ID>1</ID> 
     </ROW> 
     <ROW> 
     <ID>2</ID> 
     </ROW> 
     <ROW> 
     <ID>3</ID> 
     </ROW> 
    </TABLE1> 
    </BODY> 
</REPORT> 
<REPORT ReportType="Type Two"> 
    <TITLE ReportId="Report Two"> 
    <TITLE1>Title Two</TITLE1> 
    </TITLE> 
    <HEADER> 
    <Run_Date OrigName="Run Date">4/10/2012</Run_Date> 
    </HEADER> 
    <BODY> 
    <TABLE1> 
     <DATA /> 
     <ROW> 
     <ID>4</ID> 
     </ROW> 
     <ROW> 
     <ID>5</ID> 
     </ROW> 
     <ROW> 
     <ID>6</ID> 
     </ROW> 
    </TABLE1> 
    </BODY> 
</REPORT> 
</TEST>'; 

Antwort

2
select I.N.value('.', 'int') as ID 
from @Xml.nodes('TEST/REPORT') as R(N) 
    cross apply R.N.nodes('BODY/TABLE1/ROW/ID') as I(N) 
where R.N.exist('TITLE[@ReportId = sql:variable("@ReportId")]') = 1 
+1

Vielen Dank, ich hatte gerade angefangen, mit Kreuzknoten zu spielen. Ich habe gerade diesen Artikel gefunden, der mir geholfen hat, ihn ein wenig zu verstehen: http://blogs.msdn.com/b/simonince/archive/2009/04/24/flattening-xml-data-in-sql-server.aspx – mservidio

0

Ich weiß, das fast drei Jahre alt ist, aber ich konnte nicht widerstehen. Das CROSS APPLY ist unnötig, wenn Sie den XPATH-Ausdruck in nodes() erweitern.

SELECT ID = c.value('.', 'int') 
FROM @Xml.nodes('/TEST/REPORT[TITLE/@ReportId=sql:variable("@ReportId")]/BODY/TABLE1/ROW/ID') x(c)