简体   繁体   English

在 XML 中使用 2 CROSS APPLY

[英]Using 2 CROSS APPLY in XML

I'm using below XML to fetch the ClauseCode but it's not returning any data for the below query.我使用下面的 XML 来获取ClauseCode ,但它没有为下面的查询返回任何数据。

<Policy>
 <Plans>
    <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>3</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>1</ClauseCode>
    <ClauseCode>2</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>5</ClauseCode>
    <ClauseCode>4</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
 </Plans>
 </Policy>

Here is my query:这是我的查询:

  select proposaid,
            ,Col1.value('(/*/ProductEndorsementClauses/ClauseCode)[1]','nvarchar(max)') 
            from Policy p 
            CROSS APPLY data.nodes('/*/Plans/Plan') AS Tbl(Col)
            CROSS APPLY Tbl.Col.nodes('/ProductEndorsementClauses/ClauseCode') AS TblPec(Col1)
            where Col1.value('(ProductEndorsementClauses/ClauseCode)[1]', 'nvarchar(max)') in ('1','3')

For inspiration:灵感:

declare @x xml = N'
<Policy>
 <Plans>
    <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>3</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>1</ClauseCode>
    <ClauseCode>2</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>5</ClauseCode>
    <ClauseCode>4</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
 </Plans>
 </Policy>'

 select @x

 --all clause code values
 select t.col.value('.[1]', 'nvarchar(10)')
 from @x.nodes('Policy/Plans/Plan/ProductEndorsementClauses/ClauseCode') as t(col);

 --only clause code values that have at least a 1, 3 clause code in their parent ProductEndorsementClauses
 select t.col.value('.[1]', 'nvarchar(10)')
 from @x.nodes('Policy/Plans/Plan/ProductEndorsementClauses[(./ClauseCode/text() = "1") or (./ClauseCode/text() = "3")]/ClauseCode') as t(col);


 --result only when exists at least a  1 or 3
 select t.col.value('.[1]', 'nvarchar(max)')
 from @x.nodes('Policy/Plans/Plan/ProductEndorsementClauses/ClauseCode') as t(col)
 where @x.exist('Policy/Plans/Plan/ProductEndorsementClauses/ClauseCode[text() = "1" or text() = "3"]') = 1;



 declare @Policy table 
 (
    proposaid int,
    data xml
 );

 insert into @Policy(proposaid, data)
 values(1, N'
<Policy>
 <Plans>
    <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>3</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>1</ClauseCode>
    <ClauseCode>2</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>5</ClauseCode>
    <ClauseCode>4</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
 </Plans>
 </Policy>'),
 (2, N'
<Policy>
 <Plans>
    <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>13</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>11</ClauseCode>
    <ClauseCode>12</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
  <Plan>
       <ProductEndorsementClauses>
        <ClauseCode>15</ClauseCode>
    <ClauseCode>14</ClauseCode>
      </ProductEndorsementClauses>
  </Plan>
 </Plans>
 </Policy>');


 select *
 from @Policy;

select p.proposaid,
    t.col.value('.[1]', 'nvarchar(max)')
from @Policy as p
cross apply p.data.nodes('Policy/Plans/Plan/ProductEndorsementClauses/ClauseCode') as t(col)
where p.data.exist('Policy/Plans/Plan/ProductEndorsementClauses/ClauseCode[text() = "1" or text() = "3"]') = 1;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM