2012-04-11 9 views
3

複数のREPORTタグ要素を持つXMLデータを照会する必要があります。 REPORTIDが与えられた名前と等しい行だけを返すようにフィルタリングする必要があります。私は運がないこのフィルタを実行しようとしました。誰かがSQL ServerのXml関数を使用してここに正しい方向に私を指摘できますか?どこREPORTID(/ Iは、レポートの行に出て選択する方法を以下の考えるSQL Server Xmlからテーブルロジック

ID 
------ 
1 
2 
3 

、:

基本的に、私はテーブルとして戻って見えるように設定され、私の結果を探していますTEST/REPORT/TITLE [@ReportId = "Report One"])が 'Report One'と等しいかどうかを確認します。

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>'; 

答えて

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

非常にありがたいことに、私はちょうど交差適用ノードで遊んでいたところです。私はちょっとこれを理解するのに役立つこの記事を見つけました:http://blogs.msdn.com/b/simonince/archive/2009/04/24/flattening-xml-data-in-sql-server.aspx – mservidio

0

私は、これはほぼ3歳実現が、私は抵抗することができませんでした。 nodes()でXPATH式を展開すると、CROSS APPLYは不要です。