парсинг XML-документа с курсором в хранимой процедуре сервера SQL - PullRequest
0 голосов
/ 02 ноября 2010

У меня есть XML-документ, который я хочу передать в качестве параметра хранимой процедуре. XML выглядит следующим образом:

<root> 
    <EMPLOYEE ID= 100> 
     <PERIOD>AUG-2010</PERIOD>
        <earnings> 
               <title>BASIC</title>
        <amount>2000</amount>
        <title>HRA</title>
        <amount>1000</amount>
        <title>CONVEYANCE</title>
        <amount>500</amount>
        </earnings> 
    </EMPLOYEE> 
     <EMPLOYEE ID= 101> 
    <PERIOD>AUG-2010</PERIOD>
          <earnings> 
               <title>BASIC</title>
        <amount>2000</amount>
        <title>HRA</title>
        <amount>400</amount>
        <title>CONVEYANCE</title>
        <amount>500</amount>
        </earnings> 
    </EMPLOYEE> 

 <EMPLOYEE ID= 102> 
    <PERIOD>AUG-2010</PERIOD>
          <earnings> 
               <title>BASIC</title>
        <amount>2000</amount>
        <title>HRA</title>
        <amount>800</amount>
        <title>CONVEYANCE</title>
        <amount>5000</amount>
        </earnings> 
 </EMPLOYEE> 
</root>

Мне нужно сохранить вышеуказанную информацию в 2 таблицах, а именно: payslipdetails и payheaddetails.Я думаю, что я должен пройти через документ XML.внешний цикл дает мне идентификатор сотрудника и период, затем я вставляю в таблицу payslipdetails с этими полями и затем попадаю во внутренний цикл, и я хочу вставить payheaddetails с тем же самым employeeid и всеми его доходами, такими как

empid   title  amount
100     basic   2000
100     hra     1000
100     conveyance   500

затем я иду во внешний цикл и получаю идентификатор следующего сотрудника и повторяю то же самое

Как я могу перейти к внутреннему дочернему xml любым способом, таким как openxml и т. Д. ??

1 Ответ

0 голосов
/ 02 ноября 2010

Прежде всего, это не действительный XML:

<EMPLOYEE ID= 102> 
    <PERIOD>AUG-2010</PERIOD>
          <earnings> 
               <title>BASIC</title>
        <amount>2000</amount>
        <title>HRA</title>
        <amount>800</amount>
        <title>CONVEYANCE</title>
        <amount>5000</amount>
        </earnings> 
 </EMPLOYEE> 

За атрибутом ID= должны немедленно следовать данные - предпочтительно в двойных кавычках - это действительно:

<EMPLOYEE ID="102"> 

Далее: тот факт, что у вас есть несколько пар тегов <title>..</title><amount>...</amount> внутри тега <earnings> без контейнера вокруг них, делает анализ почти невозможным (или действительно грязным) .....

<earnings> 
   <title>BASIC</title>
   <amount>2000</amount>
   <title>HRA</title>
   <amount>800</amount>
   <title>CONVEYANCE</title>
   <amount>5000</amount>
</earnings> 

Если возможно, попробуйте изменить это на что-то вроде этого:

<earnings> 
   <earning>
     <title>BASIC</title>
     <amount>2000</amount>
   </earning>
   <earning>
     <title>HRA</title>
     <amount>800</amount>
   </earning>
   <earning>
     <title>CONVEYANCE</title>
     <amount>5000</amount>
   </earning>
</earnings> 

Это было бы намного проще обрабатывать!

Если выУ был этот дополнительный <earning> контейнер, который включает в себя пару <title>/<amount>, тогда вы могли бы легко написать этот оператор XQuery и полностью обработать все ваши потребности без грязных, медленных курсоров:

SELECT
    RootData.Employee.value('(@ID)[1]', 'int') AS 'EmployeeID',
    E.E2.value('(title)[1]', 'varchar(50)') AS 'Title',
    E.E2.value('(amount)[1]', 'decimal(18,4)') AS 'Amount'
from
    (your XML column).nodes('/root/EMPLOYEE') AS RootData(Employee)
CROSS APPLY
    RootData.Employee.nodes('earnings/earning') AS E(E2)

и вы получите что-то вроде этого:

EmployeeID  Title         Amount
  100       BASIC          2000.0000
  100       HRA            1000.0000
  100       CONVEYANCE      500.0000
  101       BASIC          2000.0000
  101       HRA             400.0000
  101       CONVEYANCE      500.0000
  102       BASIC          2000.0000
  102       HRA             800.0000
  102       CONVEYANCE     5000.0000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...