2013-04-18 119 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」