使用OPENROWSET從XML文件導入XML數據
我有一個從FTP位置下載到本地文件夾的XML文件,該XML文件中的數據如下所示。

現在,為了將數據從XML文件導入到SQL Server中的表中,我正在使用OPENROWSET函數,如下所示。
在下面的腳本中,我首先創建一個帶有一列數據類型為XML的表,然后使用OPENROWSET函數通過指定XML文件的文件位置和名稱從文件中讀取XML數據,如下所示:
CREATE DATABASE OPENXMLTesting GO USE OPENXMLTesting GO CREATE TABLE XMLwithOpenXML ( Id INT IDENTITY PRIMARY KEY, XMLData XML, LoadedDateTime DATETIME ) INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime) SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() FROM OPENROWSET(BULK 'D:\OpenXMLTesting.xml', SINGLE_BLOB) AS x; SELECT * FROM XMLwithOpenXML
查詢導入了XML數據的表時,它看起來像這樣。XMLData列是XML數據類型,它將輸出超鏈接,如下所示:

單擊上圖中的超鏈接,將在SSMS中打開另一個選項卡,其中顯示XML數據,如下所示。
<ROOT> <Customers> <Customer CustomerName="Arshad Ali" CustomerID="C001"> <Orders> <Order OrderDate="2012-07-04T00:00:00" OrderID="10248"> <OrderDetail Quantity="5" ProductID="10" /> <OrderDetail Quantity="12" ProductID="11" /> <OrderDetail Quantity="10" ProductID="42" /> </Order> </Orders> <Address> Address line 1, 2, 3</Address> </Customer> <Customer CustomerName="Paul Henriot" CustomerID="C002"> <Orders> <Order OrderDate="2011-07-04T00:00:00" OrderID="10245"> <OrderDetail Quantity="12" ProductID="11" /> <OrderDetail Quantity="10" ProductID="42" /> </Order> </Orders> <Address> Address line 5, 6, 7</Address> </Customer> <Customer CustomerName="Carlos Gonzlez" CustomerID="C003"> <Orders> <Order OrderDate="2012-08-16T00:00:00" OrderID="10283"> <OrderDetail Quantity="3" ProductID="72" /> </Order> </Orders> <Address> Address line 1, 4, 5</Address> </Customer> </Customers> </ROOT>
使用OPENXML函數處理XML數據
USE OPENXMLTesting GO DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) SELECT @XML = XMLData FROM XMLwithOpenXML EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML SELECT CustomerID, CustomerName, Address FROM OPENXML(@hDoc, 'ROOT/Customers/Customer') WITH ( CustomerID [varchar](50) '@CustomerID', CustomerName [varchar](100) '@CustomerName', Address [varchar](100) 'Address' ) EXEC sp_xml_removedocument @hDoc GO
如果要導航回父級或祖級父級並從那里獲取數據,則需要使用“ ../”讀取父級數據,並使用“ ../../”讀取祖級父級數據
USE OPENXMLTesting GO DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) SELECT @XML = XMLData FROM XMLwithOpenXML EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML SELECT CustomerID, CustomerName, Address, OrderID, OrderDate FROM OPENXML(@hDoc, 'ROOT/Customers/Customer/Orders/Order') WITH ( CustomerID [varchar](50) '../../@CustomerID', CustomerName [varchar](100) '../../@CustomerName', Address [varchar](100) '../../Address', OrderID [varchar](1000) '@OrderID', OrderDate datetime '@OrderDate' ) EXEC sp_xml_removedocument @hDoc GO
USE OPENXMLTesting GO DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) SELECT @XML = XMLData FROM XMLwithOpenXML EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML SELECT CustomerID, CustomerName, Address, OrderID, OrderDate, ProductID, Quantity FROM OPENXML(@hDoc, 'ROOT/Customers/Customer/Orders/Order/OrderDetail') WITH ( CustomerID [varchar](50) '../../../@CustomerID', CustomerName [varchar](100) '../../../@CustomerName', Address [varchar](100) '../../../Address', OrderID [varchar](1000) '../@OrderID', OrderDate datetime '../@OrderDate', ProductID [varchar](50) '@ProductID', Quantity int '@Quantity' ) EXEC sp_xml_removedocument @hDoc GO