繁体   English   中英

在SQL Server中读取XML数据

[英]Read XML data in SQL Server

在我的数据库中,我有一个具有以下格式的XML的表:

<grdCharges>
  <Row>
    <Code>92015</Code>
    <Description>Manifest Refraction</Description>
    <Units />
    <Mod1 />
    <Mod2 />
    <Mod3 />
    <Mod4 />
    <Ptr1>1</Ptr1>
    <Ptr2 />
    <Ptr3 />
    <Ptr4 />
  </Row>
  <Row>
    <Code>92014</Code>
    <Description>Established Patient Comprehensive 180 (108)</Description>
    <Units />
    <Mod1 />
    <Mod2 />
    <Mod3 />
    <Mod4 />
    <Ptr1>1</Ptr1>
    <Ptr2 />
    <Ptr3 />
    <Ptr4 />
  </Row>
</grdCharges>

我想将其转换为以下输出:

id   Code  Description   
1   92015  Manifest Refraction  
1   92014  Established Patient Comprehensive 180 (108)

我尝试过这种方式:

Create table #XML  
  (    id int  
     , xmldata xml  
  )

insert into #xml values     
 ( 1   
   ,  '<grdCharges>
    <Row>
   <Code>92015</Code>
   <Description>Manifest Refraction</Description>
    <Units />
   <Mod1 />
   <Mod2 />
   <Mod3 />
  <Mod4 />
   <Ptr1>1</Ptr1>
   <Ptr2 />
   <Ptr3 />
   <Ptr4 />
      </Row>
      <Row>
    <Code>92014</Code>
    <Description>Established Patient Comprehensive 180 (108)</Description>
    <Units />
    <Mod1 />
    <Mod2 />
    <Mod3 />
    <Mod4 />
    <Ptr1>1</Ptr1>
    <Ptr2 />
    <Ptr3 />
    <Ptr4 />
    </Row>
    </grdCharges>'

    )

select  id,  
  X.Y.value('.','Varchar(100)') Code  
 ,P.Q.value('.','Varchar(100)') Description  
   from #xml  
         Cross apply xmldata.nodes('/grdCharges/Row/Code') X(Y)  
        Cross apply Y.nodes('/grdCharges/Row/Description') P(Q) 

但这给了我以下结果:

id  Code    Description
1   92015   Manifest Refraction
1   92015   Established Patient Comprehensive 180 (108)
1   92014   Manifest Refraction
1   92014   Established Patient Comprehensive 180 (108)

我认为问题在于第二个交叉适用。 如何使用第二个十字架申请?

如果没有cross apply那么我还能做些什么来获得理想的结果? 我需要一些帮助。

您自己的尝试非常接近...

您可以使用APPLY获取重复节点的派生表。 这是<Row> ,而的节点<Row>是你想获取的值:

select  id,  
  X.Y.value('(Code/text())[1]','Varchar(100)') Code
 ,X.Y.value('(Description/text())[1]','Varchar(100)') Description  
from #xml  
Cross apply xmldata.nodes('/grdCharges/Row') X(Y)  

暂无
暂无

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

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