在 SQL Server 2017 中导入 xml 数据

Posted

技术标签:

【中文标题】在 SQL Server 2017 中导入 xml 数据【英文标题】:Import xml data in SQL Server 2017 【发布时间】:2022-01-03 21:28:43 【问题描述】:

我有这样的 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 Server 表结构:

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 的三个不同的行中。

【问题讨论】:

您的 XML 示例格式不正确。请编辑您的问题并解决它。 另外,请提供目标表的 DDL,即CREATE TABLE ... “我需要在一行中得到结果,因为它全部用于 1 个事务。但它在 sql 中的三个不同行中”是什么意思。 - 当你说“行”时,你的意思是“行”吗? 是的,对不起,我的英语不好 【参考方案1】:

请尝试以下解决方案。

当您对结果感到满意时,只需取消注释 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);

【讨论】:

非常感谢它正在工作 @daryosmitan,很高兴听到建议的解决方案对您有用。请不要忘记将其标记为答案。 @daryosmitan,您只需将答案标记为正确(绿色检查图像)。单击解决您的问题的答案左侧的绿色轮廓复选标记。这将答案标记为“已接受” 请问如何选择名称未知的 xml 文件:例如:e:\Temp\'unknown_name '.xml @daryosmitan,请澄清您的问题。不清楚你在问什么。

以上是关于在 SQL Server 2017 中导入 xml 数据的主要内容,如果未能解决你的问题,请参考以下文章

xml 使用数据导入处理程序在Solr中导入/索引数据库(MySQL或SQL Server)

在 SQL Server 2008 R2 中导入/导出视图

在 sql server 2000 中导入 Excel 电子表格

用于在SQL server表中导入India的所有城市的脚本

如何在 0xDBE 中导入 sql developer 连接文件

在 sql [Xampp] 中导入更大的数据库 - MAC OS