在 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 2000 中导入 Excel 电子表格
用于在SQL server表中导入India的所有城市的脚本