2012-10-27 64 views
1

我有一個XML文件,我將其分解爲SQL Server 2008中的一個表。它深入幾個節點,這是我第一次嘗試這樣做,所以我確信我在某處錯過了這一點。將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

我想通了這個問題後,我昨晚去睡覺!重複的

CROSS APPLY xml_data.nodes(...)

一旦我刪除的XML瞬間加載,只有97行:)

阿諾Baldvinsson,Icetips阿爾塔LLC