2010-11-02 4 views
0

J'ai un document xml que je veux passer comme paramètre à une procédure stockée le xml ressemble à cecianalyse syntaxique doc xml avec curseur dans la procédure stockée SQL Server

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

je dois stocker les informations ci-dessus à 2 tables à savoir: fiches de paie et détails de paye. Je pense que je dois parcourir le document XML. la boucle extérieure me donne l'identifiant de l'employé et de la période, puis insérer dans la table payslipdetails avec ces champs, puis entrer dans la boucle intérieure et je veux insérer le payheaddetailswith même employeeid et tous ses gains deatls comme

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

Ensuite, je vais à la boucle externe et obtenir l'ID de l'employé suivant et répéter la même chose

Comment puis-je aller à l'enfant intérieur xml de toute façon comme openxml etc .. ??

Répondre

0

D'abord, cela est pas XML valide:

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

L'attribut ID= doit être immédiatement suivi par les données - de préférence entre guillemets - ceci est valable:

<EMPLOYEE ID="102"> 

Suivant : le fait que vous ayez plusieurs paires de balises à l'intérieur de votre balise <earnings> sans un conteneur autour d'eux rend l'analyse presque impossible (ou vraiment en désordre) .....

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

Si jamais possible, essayez de changer cela à quelque chose comme ceci:

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

Ce serait beaucoup plus facile à manipuler!

Si vous avait ce conteneur <earning> supplémentaire qui entoure la paire <title>/<amount>, alors vous pouvez facilement écrire cette déclaration XQuery et répondre à tous vos besoins sans curseurs lents désordre, alltogether:

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) 

et que vous obtenir une sortie quelque chose comme ceci:

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