【发布时间】:2021-02-27 01:55:44
【问题描述】:
我有一个包含超过 45K 联系人的大型 XML 文件,我需要将它们的子元素事务迭代到 SQL 表中。我已经查看了几个解决方案,使用 value()、node() 等...,但似乎没有示例具有接近我的 XML 结构:
<Contacts>
<Contact>
<ContactID>1234</ContactID>
<ContactName>’John Doe’</ContactName>
<DOB>09031978</DOB>
<Address>’123 Main Street’</Address>
<Transactions>
<Transaction>
<TransactionID>4490</TransactionID>
<ProductName>’Recliner’</ProductName>
<Cost>123.00</Cost>
<PurchaseDate>07042020
</Transaction>
<Transaction>
<TransactionID>5678</TransactionID>
<ProductName>’Lamp’</ProductName>
<Cost>45.00</Cost>
<PurchaseDate>07042020
<Transaction>
</Transactions>
</Contact>
<Contact>
<ContactID>4567</ContactID>
<ContactName>’Jane Doe’</ContactName>
<DOB>05191984</DOB>
<Address>’567 Fake Street’</Address>
<Transactions>
<Transaction>
<TransactionID>4378</TransactionID>
<ProductName>’Coffee Table’</ProductName>
<Cost>225.00</Cost>
<PurchaseDate>07042018
</Transaction>
</Transactions>
</Contact>
</Contacts>
我需要这些数据,结果如下:
| ContactID | TransactionID | ProductName | Cost | PurchaseDate |
|---|---|---|---|---|
| 1234 | 4490 | Recliner | 123.00 | 4 July 2020 |
| 1234 | 5678 | Lamp | 45.00 | 4 July 2020 |
| 4567 | 4378 | Coffee Table | 225.00 | 4 July 2018 |
我尝试使用以下脚本进行查询:
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT stmt using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/Contacts/Contact/Transactions/Transaction',2)
WITH (ContactID int '../ContactID',
TransactionID int 'TransactionID',
ProductName nvarchar(50) 'ProductName',
Cost float 'Cost',
PurchaseDate date 'PurchaseDate')
但这会为 ContactID 返回 null;或只为每个 ContactID 返回一个交易。但我需要它来迭代并获得与联系人一样多的交易。
欢迎任何见解!
【问题讨论】:
-
提供的数据不是有效的 XML 格式,例如:
<PurchaseDate>是未闭合的标签。这是您的部分数据的复制粘贴吗?
标签: sql sql-server xml openxml