Чтение данных XML в SQL Server - PullRequest
0 голосов
/ 05 июня 2018

В моей базе данных у меня есть таблица с 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, то что еще я могу сделать, чтобы получить желаемый результат?Мне нужна помощь с этим.

1 Ответ

0 голосов
/ 05 июня 2018

Ваша собственная попытка довольно близка ...

Вы используете 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)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...