【问题标题】:How to access nested elements in xml with OpenXML如何使用 OpenXML 访问 xml 中的嵌套元素
【发布时间】:2013-04-18 09:11:42
【问题描述】:

我正在尝试将数据从一个相当大的 xml 文件导入到 SQL Server。经过一些在线搜索后,我决定使用 OpenXML。到目前为止我的查询是

DECLARE @doc INT
DECLARE @xml XML
SELECT @xml = evnt
FROM OPENROWSET (BULK 'c:\archive.xml', SINGLE_BLOB) AS Import(evnt)

EXEC sp_xml_preparedocument @doc OUTPUT, @xml

SELECT *
FROM OPENXML( @doc, '/Events/eventData/event', 2)
WITH (
  id varchar(max)
)
EXEC sp_xml_removedocument @doc

通过这种方式,我可以获取“事件”中列出的元素,但是如何从“事件”中获取更下一级的元素。 例如,我将如何获得下面的“CustId”标签?

<event>
    <custromAttribute>
        <CustId>...

“事件”内的项目主要是需要的,因此路径不能改变。 此外,任何其他方法也会很好。我需要它从 SQL Server 运行,所以不能使用 SSIS 或其他类似的外部工具。 XQuery 似乎需要很多时间。

我使用的是 SQL Server 2008 R2

【问题讨论】:

  • 为什么选择 OpenXML 而不是原生的 SQL Server XQuery 支持?似乎更容易使用和更灵活...
  • 我在很多地方读到 OpenXML 更适合处理较大的文件,尽管它非常占用内存。要解析的文件很容易超过 100MB。

标签: xml sql-server-2008-r2 openxml xml-import


【解决方案1】:

如果有人感兴趣,上述问题的解决方案很简单。

SELECT *
FROM OPENXML( @doc, '/Events/eventData/event')
WITH (
  ID varchar(max) 'id'
  CustID varchar(20) 'customAttribute/CustId',
  AttributeID varchar(20) '@id'
  SampleID varhcar(20) 'Ele1/Ele2[3]/id'
)

引号中的值应与 xml 文档中的名称完全匹配。 '@' 用于选择元素中的属性。使用“../”返回一个级别。

SampleID 在“Ele1”内的第三个“Ele2”元素中获取“id”

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2013-01-12
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多