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')
三 上述五个实例的运行结果
系统函数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')
三 上述五个实例的运行结果
相关文章推荐
- 关于SQLServer存储过程动态拼接,模糊查询的处理
- Oracle,SqlServer,DB2存储过程中异常处理
- 存储过程使用sp_xml_preparedocument处理XML文档的方法
- SQLServer下 存储过程内 包含事务 及 返回处理是否成功
- sqlserver存储过程:异常处理(转)
- SQLServer-存储过程中的简单事务处理
- Oracle,SqlServer,DB2存储过程中异常处理
- sqlserver存储过程中sql语句连接及datetime字段的处理
- SQLServer-存储过程中的简单事务处理
- SQLServer下 存储过程内 包含事务 及 返回处理是否成功
- SQLServer下 存储过程内 包含事务 及 返回处理是否成功
- SQLServer 存储过程嵌套事务处理
- sqlserver 存储过程拼接SQL字符串有数字的处理办法
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
- 关于SQLSERVER 事物的运用(3)嵌套事物以及嵌套存储过程的异常的处理
- SQLServer 存储过程嵌套事务处理
- 【Java】JAXB 处理 复杂XML 与JavaBean 互相转化过程
- Sql Server存储过程之异常的简单处理
- C#中的类SqlCommand对象使用方法ExecuteNonQuery()调用SQLServer存储过程时,存储过程执行成功,数据发生改变,但是返回-1
- sqlserver 基础(增、删、改、查、链表查询、建立聚焦索引、主键、创建约束、创建外键)、触发器、存储过程