OPENXML
OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] ) [ WITH ( SchemaDeclaration | TableName ) ]
idoc
XML 文档的内部表式形式的文档句柄。 通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式形式。
rowpattern
XPath 模式,用于标识要作为行处理的节点。 节点来自在 idoc 参数中传递句柄的 XML 文档。
flag
指明在 XML 数据和关系行集间使用的映射,以及如何填充溢出列。 flag 为可选输入参数,可以是下列值之一。
字节值 | 描述 |
---|---|
0 | 默认为“以属性为中心”的映射。 |
1 | 使用“以属性为中心”的映射。 可以与 XML_ELEMENTS 一起使用。 在这种情况下,“以属性为中心”映射先应用。 接下来,对任何剩余列应用“以元素为中心”映射。 |
2 | 使用“以元素为中心”的映射。 可以与 XML_ATTRIBUTES 一起使用。 在这种情况下,“以属性为中心”映射先应用。 接下来,对任何剩余列应用“以元素为中心”映射。 |
8 | 可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑或)。 在检索上下文中,此标志指明不得将已用数据复制到溢出属性 @mp:xmltext。 |
例 1(可从官网查阅更多例子):
DECLARE @xml VARCHAR(MAX);
DECLARE @iDOM INT,
@iret INT;
SET @xml
= '<?xml version="1.0" encoding="gb2312"?>
<root>
<le>
<RecordID>1</RecordID>
<A1>计算机中心</A1>
<A2>210800468</A2>
</le>
</root>';
EXEC @iret = sp_xml_preparedocument @iDOM OUTPUT, @xml;
IF @iret > 0
BEGIN
EXEC sp_xml_removedocument @iDOM;
END;
IF OBJECT_ID('tempdb..#A') IS NOT NULL
DROP TABLE #A;
SELECT *
INTO #A
FROM
OPENXML(@iDOM, '/root/le', 2)
WITH
(
RecordID INT,
A1 VARCHAR(100),
A2 VARCHAR(100)
);
--下面是分析主数据 。
EXEC sp_xml_removedocument @iDOM;
SELECT *
FROM #A;
IF OBJECT_ID('tempdb..#A') IS NOT NULL
DROP TABLE #A;
结果:
例2:
DECLARE @idoc INT, @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>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity');