使用sp_xml_preparedocument处理XML文档 保存到sqlserver中
来源:互联网 发布:女生裹被走红网络 编辑:程序博客网 时间:2024/05/21 07:11
有时会在存储过程中处理一些XML格式的数据,所以会用到sp_xml_preparedocument,他可以将XML数据进行读取,然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码就是使用sp_xml_preparedocument读取XML:
DECLARE @hdoc intDECLARE @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子句,查询出来的是一个默认的表结构,如下:
表格列的解释说明:
在WITH子句中,我们还可以通过设置来获取父级元素的属性值:
DECLARE @hdoc intDECLARE @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, @docSELECT *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 ----------- ---------- ----------------------- ----------- ----------- 10248 VINET 1996-07-04 00:00:00.000 11 12 10248 VINET 1996-07-04 00:00:00.000 42 10 10283 LILAS 1996-08-16 00:00:00.000 72 3 有时候XML中的数据并不是以属性的方式存在,而是直接放在节点中,如下:
DECLARE @doc varchar(1000)SET @doc ='<ROOT><Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order></Customer></ROOT>'
此时要获Order节点下的各项的值,可以用下面方法:
DECLARE @hdoc intDECLARE @doc varchar(1000)SET @doc ='<ROOT><Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order></Customer></ROOT>'EXEC sp_xml_preparedocument @hdoc OUTPUT, @docSELECT *FROM OPENXML (@hdoc, '/ROOT/Customer/Order',1)WITH (OrderID int 'OrderID', CustomerID varchar(10) 'CustomerID', EmployeeID int 'EmployeeID', OrderDate datetime 'OrderDate')
查询结果如下: OrderID CustomerID EmployeeID OrderDate ----------- ---------- ----------- ----------------------- 10248 VINET 5 1996-07-04 00:00:00.000 可以看出是取属性值还是取节点的文本的值区别在于WITH子句的第三个参数是否有@符号
- 使用sp_xml_preparedocument处理XML文档 保存到sqlserver中
- 使用sp_xml_preparedocument处理XML文档
- 存储过程使用sp_xml_preparedocument处理XML文档的方法
- 用linq解析xml文档保存到sqlserver数据库
- 在SQLServer 2005中处理XML格式文档
- 创建XML文档并保存到磁盘文件中(GBK)
- SQL 中 sp_xml_preparedocument,openxml的使用
- NSIS ---使用nsDialogs创建自定义页面,并获取输入到控件中的内容保存到一个XML文档中
- sp_xml_preparedocument的使用
- 创建XML文档并保存到磁盘文件中(UTF-8)
- 在VC6中使用MSXML 4.0 DOM处理XML文档
- 在VC6中使用MSXML 4.0 DOM处理XML文档
- 使用SAX处理XML文档
- 使用JAXB处理XML文档
- 使用JAXB处理XML文档
- 使用SAX处理XML文档
- 使用 SAX 处理 XML 文档
- 使用 SAX 处理 XML 文档
- Android File类 根据官方文档理解(转)
- 迭代器Iterator的简单实现
- expdp导出
- jsPlumb 拖拽效果限定范围
- JNI方法的Signature
- 使用sp_xml_preparedocument处理XML文档 保存到sqlserver中
- Android 沉浸式状态栏-字体颜色与背景颜色修改实现与兼容
- C++ Json 的几个操作
- MediaPlayer本地播放流程解析(1)
- 计算机视觉与深度学习(5)
- 解决Elasticsearch-head插件链接不上服务
- 数字检查
- i节点(inode)和文件描述符(file descriptor)的区别和联系
- 数据结构课程设计-停车场管理系统