3

複数のREPORTタグ要素を持つXmlデータをクエリする必要があります。REPORTIDが指定された名前と等しい行のみを返すようにフィルタリングする必要があります。運が悪かったので、このフィルターを実行しようとしました。誰かがSQLServerXml関数を使用して、ここで正しい方向に私を向けることができますか?

基本的に、テーブルとして返され、次のようになる結果セットを探しています。

ID
------
1
2
3

次の場合、REPORTID(/ TEST / REPORT / TITLE [@ReportId = "Report One"])が'Report One'と等しいREPORTの行をどのように選択しますか?

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

2 に答える 2

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
于 2012-04-11T15:24:07.110 に答える
0

3年近く経ちましたが、抵抗できませんでした。ノード()でXPATH式を展開する場合、CROSSAPPLYは不要です。

SELECT  ID = c.value('.', 'int')
FROM @Xml.nodes('/TEST/REPORT[TITLE/@ReportId=sql:variable("@ReportId")]/BODY/TABLE1/ROW/ID') x(c)
于 2015-02-17T20:04:05.770 に答える