vignesh
vignesh

Reputation: 1454

xml to sql tables

Need to convert xml into sql table.

Sample XML

<?xml version="1.0"?> <ConsumerTransactionList>   <ConsumerTransaction>
    <SourceSystem>
      <SourceTimestamp>2016-03-02T16:10:33+08:00</SourceTimestamp>
      <MarketCode>CHN</MarketCode>
    </SourceSystem>
    <TransactionHeader>
      <PersonnelCode>4215</PersonnelCode>
      <TransactionConsumer>
        <ConsumerId>15859625</ConsumerId>
      </TransactionConsumer>
    </TransactionHeader>
    <TransactionDetailList>
      <TransactionDetail>
        <LineNum>1</LineNum>
        <TransactionTypeCode>sle</TransactionTypeCode>
      </TransactionDetail>
      <TransactionDetail>
        <LineNum>2</LineNum>
        <TransactionTypeCode>rdm</TransactionTypeCode>
      </TransactionDetail>
    </TransactionDetailList>   </ConsumerTransaction>   <ConsumerTransaction>
    <SourceSystem>
      <SourceTimestamp>2016-03-02T16:12:27+08:00</SourceTimestamp>
      <MarketCode>KMU</MarketCode>
    </SourceSystem>
    <TransactionHeader>
      <PersonnelCode>4152</PersonnelCode>
      <TransactionConsumer>
        <ConsumerId>48578589</ConsumerId>
      </TransactionConsumer>
    </TransactionHeader>
    <TransactionDetailList>
      <TransactionDetail>
        <LineNum>1</LineNum>
        <TransactionTypeCode>sle</TransactionTypeCode>
      </TransactionDetail>
      <TransactionDetail>
        <LineNum>10</LineNum>
        <TransactionTypeCode>rdm</TransactionTypeCode>
      </TransactionDetail>
      <TransactionDetail>
        <LineNum>11</LineNum>
        <TransactionTypeCode>rdm</TransactionTypeCode>
      </TransactionDetail>
    </TransactionDetailList>   </ConsumerTransaction> </ConsumerTransactionList>

Expected output: Expected output :

This is what I've tried so far:

This query generates permutation combination for the xml. Query need to populate a result set for each tag. But my query mingles all tags.Here only Im struggling.

SELECT  
x.item.value('SourceTimestamp[1]','varchar(100)'),  x.item.value('MarketCode[1]','varchar(100)'),
    y.item.value('PersonnelCode[1]','varchar(100)')
    ,z.item.value('ConsumerId[1]','varchar(100)'),  
    x1.item.value('LineNum[1]','varchar(100)'), x1.item.value('TransactionTypeCode[1]','varchar(100)') 

FROM 
 @x.nodes('//ConsumerTransaction/SourceSystem') AS x(item)
 cross join @x.nodes('//ConsumerTransaction/TransactionHeader') AS y(item)
 cross join @x.nodes('//ConsumerTransaction/TransactionHeader/TransactionConsumer') AS z(item)
 cross apply @x.nodes('//ConsumerTransaction/TransactionDetailList/TransactionDetail') as x1(item)

Upvotes: 2

Views: 304

Answers (2)

Oscar C
Oscar C

Reputation: 1

Some idea for this example:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:e="http://www.technisys.net/cmm/services/errors/v1.0" xmlns:md="http://www.technisys.net/cmm/services/metadata/v2.0"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <SOAP-ENV:Header>
     <md:metadata><traceNumber>191750</traceNumber>
         <serviceId>processSystemUserLoginByCustomerMigration</serviceId>
         <serviceVersion>0.0</serviceVersion>
         <sessionId>OAUTH2_58f93b26-f876-42ab-aa41-2c9d482a199f_rriosc@bancofalabella.com.pe</sessionId>
         <targetChannel>
             <mnemonic>PF</mnemonic>
         </targetChannel>
         <executingChannel>
             <mnemonic>PF</mnemonic>
         </executingChannel>
         <address>ip=10.255.0.2;</address>
         <sourceDate>20190201101319013</sourceDate>
         <channelDispatchDate>xxxxxxxxxxxx</channelDispatchDate>
         <locale>es_AR</locale>
         <featureId>ROL@4702</featureId>
         <institutionType>UNDEFINED</institutionType>
         <msgTypeId>200</msgTypeId>
         <terminalId>browser=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36;platform=;subChannel=;terminalCode=;</terminalId>
         <organizationId></organizationId>
         <organizationOperatorId>uriTech=OPERADOR_BANCO@9884015;uriSFB=150059641;branchCode=209;[email protected];execCodePosition=4;execNamePosition=EECC;execCodeRole=3;execNameRole=Ejecutivos Comerciales;</organizationOperatorId>
         <executingOperatorId>uriTech=OPERADOR_BANCO@9884015;uriSFB=150059641;branchCode=209;[email protected];execCodePosition=4;execNamePosition=EECC;execCodeRole=3;execNameRole=Ejecutivos Comerciales;</executingOperatorId>
         <paginationInfo></paginationInfo>
         <branchId>1</branchId>
         <userId></userId>
         <parityCurrencyId />
         <localCurrencyId />
         <localCountryId />
         <bankId />
         <organizationType/>
     </md:metadata>

    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
     <srv:processSystemUserLoginByCustomerMigrationRequest xmlns:srv="http://www.technisys.net/cmm/services/processSystemUserLoginByCustomerMigration/rq/v0.0">
     <generic><sessionId type="java.lang.String">OAUTH2_58f93b26-f876-42ab-aa41-2c9d482a199f_rriosc@bancofalabella.com.pe</sessionId><forceToAdhere type="java.lang.Boolean">false</forceToAdhere></generic><customer name="customer"><identificationNumber>12345678</identificationNumber><identificationType><mnemonic>DNI</mnemonic></identificationType></customer>
     </srv:processSystemUserLoginByCustomerMigrationRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Upvotes: 0

Gottfried Lesigang
Gottfried Lesigang

Reputation: 67321

Assuming your XML is in a variable named @test you might try this:

SELECT CT.value('(SourceSystem/SourceTimestamp)[1]','datetime') AS SourceTimeStamp 
      ,CT.value('(SourceSystem/MarketCode)[1]','varchar(max)') AS MarketCode
      ,CT.value('(TransactionHeader/PersonnelCode)[1]','int') AS PersonnelCode
      ,CT.value('(TransactionHeader/TransactionConsumer/ConsumerId)[1]','int') AS ConsumerId
      ,TD.value('LineNum[1]','int') AS LineNum
      ,TD.value('TransactionTypeCode[1]','varchar(max)') AS TransactionTypeCode
FROM @test.nodes('/ConsumerTransactionList/ConsumerTransaction') AS A(CT)
CROSS APPLY CT.nodes('TransactionDetailList/TransactionDetail') AS B(TD)

Upvotes: 3

Related Questions