3

我需要查询具有多个 REPORT 标记元素的 Xml 数据。需要对其进行过滤以仅返回 REPORTID 等于给定名称的行。我试图执行这个过滤器,但没有运气。有人可以在这里使用 Sql Server Xml 函数为我指明正确的方向吗?

基本上,我正在寻找我的结果集以表格形式返回,如下所示:

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

我意识到这已经快三岁了,但我无法抗拒。如果在nodes() 中展开XPATH 表达式,则不需要CROSS APPLY。

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 回答