2012-10-27 2 views
1

SQL Server 2008의 테이블에 파쇄 할 XML 파일이 있습니다. 몇 가지 노드가 심층적으로 처리되므로이 작업을 처음 시도합니다. 나는 어딘가에서 요점을 놓치고있다.XML을 SQL Server 2008로 분할하면 복제본이 생성됩니다.

97 레코드가있는 XML의 경우 각 레코드가 97 번, 즉 총 9409 행이 결과 집합에 포함됩니다. 그것은 약 37 초 걸립니다. SELECT DISTINCT을 사용하면 97 행을 얻지 만 예상대로 37 초가 걸립니다. 는 XML의

첫 번째 행 :

<?xml version="1.0" encoding="utf-8"?> 
<trmFileDataStream> 
<getTransactionDetails> 
    <getTransactionDetailsResponse> 
    <messages> 
     <resultCode>Ok</resultCode> 
     <message> 
     <code>I00001</code> 
     <text>Successful.</text> 
     </message> 
    </messages> 
    <transaction> 
     <transId>4570599999</transId> 
     <submitTimeUTC>2012-08-12T20:52:05.01Z</submitTimeUTC> 
     <submitTimeLocal>2012-08-12T15:52:05.01</submitTimeLocal> 
     <transactionType>authCaptureTransaction</transactionType> 
     <transactionStatus>pendingSettlement</transactionStatus> 
     <responseCode>1</responseCode> 
     <responseReasonCode>1</responseReasonCode> 
     <responseReasonDescription>Approval</responseReasonDescription> 
     <AVSResponse>P</AVSResponse> 
     <batch> 
     <batchId>2007999999</batchId> 
     <settlementTimeUTC>2012-08-12T21:12:40.193Z</settlementTimeUTC> 
     <settlementTimeLocal>2012-08-12T16:12:40.193</settlementTimeLocal> 
     <settlementState>pendingSettlement</settlementState> 
     </batch> 
     <authAmount>99.04</authAmount> 
     <settleAmount>99.04</settleAmount> 
     <taxExempt>false</taxExempt> 
     <payment> 
     <bankAccount> 
      <routingNumber>XXXXCCCC</routingNumber> 
      <accountNumber>XXXXNNNN</accountNumber> 
      <nameOnAccount>Account Name</nameOnAccount> 
      <echeckType>WEB</echeckType> 
     </bankAccount> 
     </payment> 
     <customer> 
     <id>UWYN201H7C</id> 
     </customer> 
     <billTo> 
     <firstName>FirstName</firstName> 
     <lastName>LastName</lastName> 
     <address>123245 Some street.</address> 
     <city>Some City</city> 
     <state>WS</state> 
     <zip>36123</zip> 
     <country>USA</country> 
     <phoneNumber>1234567891</phoneNumber> 
     </billTo> 
     <recurringBilling>false</recurringBilling> 
    </transaction> 
    </getTransactionDetailsResponse> 

SELECT 문 :

SELECT distinct 
    transactions.value ('(transId/text())[1]','varchar(100)') AS transID, 
    Replace(Replace(transactions.value ('(submitTimeUTC/text())[1]','varchar(100)'),'T',' '),'Z',' ') AS submitTimeUTC, 
    Replace(transactions.value ('(submitTimeLocal/text())[1]','varchar(100)'),'T',' ') AS submitTimeLocal, 
    transactions.value ('(transactionType/text())[1]','varchar(100)') AS transactionType, 
    transactions.value ('(transactionStatus/text())[1]','varchar(100)') AS transactionStatus, 
    transactions.value ('(responseCode/text())[1]','varchar(100)') AS responseCode, 
    transactions.value ('(responseReasonCode/text())[1]','varchar(100)') AS responseReasonCode, 
    transactions.value ('(responseReasonDescription/text())[1]','varchar(100)') AS responseReasonDescription, 
    transactions.value ('(AVSResponse/text())[1]','varchar(100)') AS AVSResponse, 
    transactions.value ('(authAmount/text())[1]','decimal(10,2)') AS authAmount, 
    transactions.value ('(settleAmount/text())[1]','decimal(10,2)') AS settleAmount, 
    transactions.value ('(taxExempt/text())[1]','varchar(100)') AS taxExempt, 
    transactions.value ('(recurringBilling/text())[1]','varchar(100)') AS recurringBilling, 
    rootb.value  ('(fileInformationLine/text())[1]','varchar(100)') AS FileInfo, 

    messagesb.value ('(resultCode/text())[1]','varchar(100)') AS resultCode, 
    messageb.value  ('(code/text())[1]','varchar(100)') AS MsgCode, 
    messageb.value  ('(text/text())[1]','varchar(100)') AS MsgText, 

    batch.value  ('(batchId/text())[1]','varchar(100)') AS batchID, 
    batch.value  ('(settlementTimeUTC/text())[1]','varchar(100)') AS settlementTimeUTC, 
    batch.value  ('(settlementTimeLocal/text())[1]','varchar(100)') AS settlementTimeLocal, 
    batch.value  ('(settlementState/text())[1]','varchar(100)') AS settlementState, 

    bankacc.value  ('(routingNumber/text())[1]','varchar(100)') AS routingNumber, 
    bankacc.value  ('(accountNumber/text())[1]','varchar(100)') AS accountNumber, 
    bankacc.value  ('(nameOnAccount/text())[1]','varchar(100)') AS nameOnAccount, 
    bankacc.value  ('(echeckType/text())[1]','varchar(100)') AS echeckType, 

    Customer.value  ('(id/text())[1]','varchar(100)') AS customerID, 

    billTo.value  ('(firstName/text())[1]','varchar(100)') AS firstName, 
    billTo.value  ('(lastName/text())[1]','varchar(100)') AS lastName, 
    billTo.value  ('(address/text())[1]','varchar(100)') AS address, 
    billTo.value  ('(city/text())[1]','varchar(100)') AS city, 
    billTo.value  ('(state/text())[1]','varchar(100)') AS state, 
    billTo.value  ('(zip/text())[1]','varchar(100)') AS zip, 
    billTo.value  ('(country/text())[1]','varchar(100)') AS country, 
    billTo.value  ('(phoneNumber/text())[1]','varchar(100)') AS phoneNumber 

FROM 
    xmlImportTempTable 

/* Message branch */ 
CROSS APPLY 
    xml_data.nodes('//trmFileDataStream/getTransactionDetails/getTransactionDetailsResponse') AS tMsg(getTD) 

OUTER APPLY  getTD.nodes('messages') AS getTD(messagesb) 
OUTER APPLY messagesb.nodes('message') AS messagesb(messageb) 

/* Transaction branches */ 
CROSS APPLY xml_data.nodes('//trmFileDataStream') AS Txn(rootb) 

OUTER APPLY  rootb.nodes('getTransactionDetails')   AS rootb(getTransDetl) 
OUTER APPLY getTransDetl.nodes('getTransactionDetailsResponse') AS rootc(getTransDtlResp) 
OUTER APPLY getTransDtlResp.nodes('transaction')    AS rootd(transactions) 

OUTER APPLY transactions.nodes('batch')  AS btc(batch) 
OUTER APPLY transactions.nodes('payment')  AS pmt(payment) 
OUTER APPLY  payment.nodes('bankAccount') AS bacc(bankacc) 
OUTER APPLY transactions.nodes('customer') AS cust(customer) 
OUTER APPLY transactions.nodes('billTo')  AS billing(billTo) 

ORDER BY transID 
내가 (성능과 함께 살 수있는이 지속적으로 수입되며 XML 파일은 6 ~ 7 시간이 될 수

이것보다 크다) 올바른 결과를 추출 할 수 있기 때문이다. 하지만이 작업을 정확하게 수행하는 방법을 정확히 파악할 수 있기를 정말로 바랍니다. 난 그냥 여기 (http://stackoverflow.com/questions/61233/the-best-way-to-shred-xml-data-into-sql-server-database-columns) 스키마를 추가하는 것이 엄청난 도움이 될 것이라고 성능과 나는 내일 그것을 시도 할 것이다. 여러 행은 나에게 난처한 문제입니다. 나는 지난 밤에 잠자리에 들었 후

많은 감사 사전 :

아르노르 Baldvinsson, Icetips 알타 LLC에

답변

0

나는이 문제를 알아 냈어! 나는 XML을 즉시로드 것을 제거되면 중복

CROSS는 xml_data.nodes (...)

를 적용에만 97 행 :

아르노르 Baldvinsson, Icetips 알타 LLC

관련 문제