国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

使用sp_xml_preparedocument處理XML文檔的方法

2020-07-25 13:21:17
字體:
來源:轉載
供稿:網友

有時會在存儲過程中處理一些XML格式的數據,所以會用到sp_xml_preparedocument,他可以將XML數據進行讀取,然后使用 MSXML 分析器 (Msxmlsql.dll) 對其進行分析。我們就可以很容易的在存儲過程中得到XML中我們想要的數據。下面的代碼就是使用sp_xml_preparedocument讀取XML:

復制代碼 代碼如下:

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

上面只是讀取了XML,要想獲取XML數據還需要使用OPENXML,代碼如下:
復制代碼 代碼如下:

SELECT *
FROM openxml(@hdoc,'/ROOT/Customer',1)
WITH (CustomerID VARCHAR(40),ContactName VARCHAR(40))

OPENXML有三個參數:
第一個是sp_xml_preparedocument讀取是的OUTPUT參數,在本示例中就是@hdoc;
第二個是一個XPath表達式,用來獲取指定位置的數據;
第三個是一個可選項,用來表示獲取的方式,有0,1,2,8四種取值,詳細解釋請看
FROM后面的WITH也是可選的,用來指定獲取哪些數據字段,上面代碼中只取了CustomerID和ContactName。上面的查詢結果如下:
CustomerID ContactName
―――――――――――――- ―――――――――――――-
VINET Paul Henriot
LILAS Carlos Gonzlez
如果不指定WITH子句,查詢出來的是一個默認的表結構,如下:


表格列的解釋說明:

列名數據類型說明
idbigint文檔節點的唯一 ID。

根元素的 ID 值為 0。保留負 ID 值。

parentidbigint標識節點的父節點。此 ID 標識的父節點不一定是父元素。具體情況取決于此 ID 所標識節點的子節點的節點類型。例如,如果節點為文本節點,則其父節點可能是一個屬性節點。

如果節點位于 XML 文檔的頂層,則其 ParentID 為 NULL。

節點類型int標識節點類型,是對應于 XML 對象模型 (DOM) 節點類型編號的一個整數。

下列值是可以顯示在此列中以指明節點類型的值:

1 = 元素節點

2 = 屬性節點

3 = 文本節點

4 = CDATA 部分節點

5 = 實體引用節點

6 = 實體節點

7 = 處理指令節點

8 = 注釋節點

9 = 文檔節點

10 = 文檔類型節點

11 = 文檔片段節點

12 = 表示法節點

有關詳細信息,請參閱 Microsoft XML (MSXML) SDK 中的“節點類型屬性”主題。

localnamenvarchar(max)提供元素或屬性的本地名稱。如果 DOM 對象沒有名稱,則為 NULL。
prefixnvarchar(max)節點名稱的命名空間前綴。
namespaceurinvarchar(max)節點的命名空間 URI。如果值是 NULL,則命名空間不存在。
datatypenvarchar(max)元素或屬性行的實際數據類型,否則是 NULL。數據類型是從內聯 DTD 中或從內聯架構中推斷得出。
prevbigint前一個同級元素的 XML ID。如果前面沒有同級元素,則為 NULL。
textntext包含文本形式的屬性值或元素內容。如果邊緣表項不需要值則為 NULL。

在WITH子句中,我們還可以通過設置來獲取父級元素的屬性值:

復制代碼 代碼如下:

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
SELECT *
FROM OPENXML (@hdoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')

查詢的結果為:
OrderID CustomerID OrderDate ProdID Qty
――― 主站蜘蛛池模板: 庆阳市| 新晃| 寻甸| 安顺市| 舟山市| 桑日县| 昆明市| 东安县| 马公市| 奉新县| 阿尔山市| 涡阳县| 浮山县| 如东县| 沁源县| 塘沽区| 琼结县| 南宁市| 富蕴县| 宜宾县| 洪泽县| 梧州市| 西城区| 庆云县| 长武县| 福贡县| 博野县| 屏南县| 贺兰县| 新和县| 汽车| 龙胜| 济南市| 新余市| 沈阳市| 阿坝县| 大名县| 海南省| 昭苏县| 高阳县| 关岭|