2013-04-18 78 views
1

我试图将数据从一个相当大的xml文件导入到SQL Server。经过一些在线搜索后,我决定使用OpenXML。查询我至今是如何使用OpenXML访问xml中的嵌套元素

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的

+0

你为什么会选择的OpenXML,而不是本地的SQL Server XQuery支持?看起来更容易使用,更灵活... –

+0

我读了很多地方,OpenXML更好的大文件,但它是非常强大的内存。要解析的文件可以轻松超过100MB。 – Ryez

回答

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取出里面的第三个“Ele2”元素之内'身份证“ELE1”