您的位置:首页 > 数据库

SQLServer-存储过程中xml的处理

2007-05-15 23:17 381 查看
一 简介
系统函数OPENXML 对xml文档中指定的部分生成行集视图。由于OPENXML可以生成行集,它可以用在需要行集的Transact-SQL语句中,表、视图或函数OPENROWSET也可以提供行集。
二 基本操作
1. 仅映射Attribute(flags = 1 or XML_ATTRIBUTE)
将xml中指定结点映射成记录,结点的属性值作为记录的域值
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="1" ContactName="Paul Henriot">
<Order CustomerID="1" EmployeeID="5">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="2" ContactName="Carlos Gonzlez">
<Order CustomerID="2" EmployeeID="3">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM
OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID int,
ContactName varchar(20))
EXEC sp_xml_removedocument @idoc

2. 仅映射Element(flags = 2 or XML_ELEMENT)
将xml中指定结点映射成记录,指定结点的子结点值作为记录的域值
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer>
<CustomerID>1</CustomerID>
<ContactName>Paul Henriot</ContactName>
<Order CustomerID="1" EmployeeID="5">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer>
<CustomerID>2</CustomerID>
<ContactName>Carlos Gonzlez</ContactName>
<Order CustomerID="2" EmployeeID="3">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM
OPENXML (@idoc, '/ROOT/Customer',2)
WITH (CustomerID int,
ContactName varchar(20))
EXEC sp_xml_removedocument @idoc

3. 混合XML_ATTRIBUTE 、XML_ELEMENT模式
将xml中指定结点映射成记录,结点的值或属性值作为记录的域值,用户在OPENXML的WITH子句中必需显式指定属性名或字节点.
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="1" ContactName="Paul Henriot">
<Order CustomerID="1">5</Order>
</Customer>
<Customer CustomerID="2" ContactName="Carlos Gonzlez">
<Order CustomerID="2">6</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM
OPENXML (@idoc, '/ROOT/Customer',3) -- X ML_ATTRIBUTE + XML_ELEMENT = 1 + 2
WITH (CustomerID int,
ContactName varchar(20),
[Order] int)
EXEC sp_xml_removedocument @idoc

4. 显式指定参数Colpattern
将xml中指定结点映射成记录. 记录的域值由用户通过xml的路径来指定,’.’代表指定的结点.如果指定的名称前有’@’标记,表明是指定结点的一个属性.
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer>
<CustomerID>1</CustomerID>
<ContactName>Paul Henriot</ContactName>
<Order CustomerID="1" EmployeeID="5">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer>
<CustomerID>2</CustomerID>
<ContactName>Carlos Gonzlez</ContactName>
<Order CustomerID="2" EmployeeID="3">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM
OPENXML (@idoc, '/ROOT/Customer')
WITH (CustomerID int './CustomerID',
ContactName varchar(20) './ContactName',
EmployeeID int './Order/@EmployeeID')
EXEC sp_xml_removedocument @idoc

5. 半显式指定参数Colpattern
将xml中指定结点映射成记录. 记录的域值由用户通过xml的路径来显式指定,或根据OPENXML的Flag参数规则隐式确定,’.’代表指定的结点.如果指定的名称前有’@’标记,表明是指定结点的一个属性.
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer>
<CustomerID>1</CustomerID>
<ContactName>Paul Henriot</ContactName>
<Order CustomerID="1" EmployeeID="5">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer>
<CustomerID>2</CustomerID>
<ContactName>Carlos Gonzlez</ContactName>
<Order CustomerID="2" EmployeeID="3">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM
OPENXML (@idoc,'ROOT/Customer',2 /*默认的部分以该标识为准*/)
WITH (CustomerID int,
ContactName varchar(20),
EmployeeID int './Order/@EmployeeID')

三 上述五个实例的运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐