簡體   English   中英

在 SQL 服務器 2017 中導入 xml 數據

[英]Import xml data in SQL Server 2017

我有這樣的 XML 數據:

<?xml version="1.0" ?>
<SettlementFile>
    <Transaction>
        <Identifier>
            <StationID>049215901 </StationID>
            <TransactionTimestamp>2021-04-01T10:39:32</TransactionTimestamp>
        </Identifier>
        <TerminalInfo>
            <TerminalID>21590151</TerminalID>
            <TerminalType>2</TerminalType>
        </TerminalInfo>
        <TransactionInfo>
            <TransactionType>0</TransactionType>
            <TransactionAmount>3.74</TransactionAmount>
            <CurrencyCode>978</CurrencyCode>
            <CustomerInput>
                <Mileage>0</Mileage>
            </CustomerInput>
            <TicketNumber>213510037</TicketNumber>
            <AuthorisationType>1</AuthorisationType>
        </TransactionInfo>
    </Transaction>
</SettlementFile>

我的 SQL 服務器表結構:

CREATE TABLE dbo.Import_Oase 
(
    StationID            varchar(50) NULL,
    TransactionTimestamp datetime    NULL,
    TicketNumber         int         NULL,
    Mileage              varchar(50) NULL
) ON PRIMARY

我正在嘗試使用此SELECT查詢:

SELECT 
    MY_XML.Details.query('StationID')           .value('.', 'VARCHAR(50)'),
    MY_XML.Details.query('TransactionTimestamp').value('.', 'Datetime'),
    MY_XML.Details.query('TicketNumber')        .value('.', 'Integer'),
    MY_XML.Details.query('Mileage')             .value('.', 'VARCHAR(50)')
FROM
    (SELECT
         CAST(MY_XML AS XML)
     FROM
         OPENROWSET(BULK '\\EO-TEST\SQL-Daten\Temp\MY_XML.xml', SINGLE_BLOB) AS T(MY_XML)
    ) AS T(MY_XML)
CROSS APPLY 
    MY_XML.nodes('SettlementFile/Transaction/Identifier, SettlementFile/Transaction/TransactionInfo, SettlementFile/Transaction/TransactionInfo/CustomerInput') AS MY_XML (Details);

我需要在一行中得到結果,因為它全部用於 1 筆交易。 但它在 SQL 中位於三個不同的行中。

請嘗試以下解決方案。

當您對結果感到滿意時,只需取消注釋INSERT INTO行。

SQL

WITH rs (xmlData) AS
(
   SELECT TRY_CAST(BulkColumn AS XML) 
   FROM OPENROWSET(BULK N'e:\Temp\ daryosmitan.xml', SINGLE_BLOB) AS x
)
-- INSERT INTO dbo.Import_Oase (StationID, TransactionTimestamp, TicketNumber, Mileage)
SELECT c.value('(Identifier/StationID/text())[1]', 'VARCHAR(50)') AS StationID
    , c.value('(Identifier/TransactionTimestamp/text())[1]', 'DATETIME') AS TransactionTimestamp
    , c.value('(TransactionInfo/TicketNumber/text())[1]', 'VARCHAR(50)') AS TicketNumber
    , c.value('(TransactionInfo/CustomerInput/Mileage/text())[1]', 'INT') AS Mileage
FROM rs 
   CROSS APPLY xmlData.nodes('/SettlementFile/Transaction') AS t(c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM