SQL Server2008 程序设计 XML

2024-03-08 04:48

本文主要是介绍SQL Server2008 程序设计 XML,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

--SQL Server2008 程序设计 XML
/********************************************************************************            
*主题:SQL Server2008 程序设计 XML
*说明:本文是个人学习的一些笔记和个人愚见            
*      有很多地方你可能觉得有异议,欢迎一起讨论            
*作者:Stephenzhou(阿蒙)            
*日期: 2012.12.6    
*Mail:szstephenzhou@163.com            
*另外:转载请著名出处。            
**********************************************************************************/  


 


--在开发中为了显示必须把关系数据库转换为xml,而由xsd类型的约束进行限制的成本是非常高的。
--对于希望执行验证

--SQL Server 架构集合
-- 定义个一个order_xsd 
--下面架构定义了三个元素
--OrderAmt 使用了orderamt类型,它定义为int类型 最少值为1 最大为4999

 

create xml schema collection dbo.order_xsd
AS '
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="orderAmt">
<xsd:restriction base="xsd:int">
<xsd:maxInclusive value="5000"/>
<xsd:minExclusive value="1"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="Order">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CustomerName" type="xsd:string"/>
<xsd:element name="OrderDate" type="xsd:dateTime"/>
<xsd:element name="OrderAmt" type="orderAmt"/>   
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>'
go   


--以架构创建表

create table xml_schematest(
order_id int primary key ,
order_xml xml(order_xsd)  --order_xml列绑定 order_xsd 架构
)



---插入

insert into xml_schematest values(1,'<order/>')
/*
消息 6913,级别 16,状态 1,第 1 行
--XML 验证: 找不到元素 'order' 的声明。位置:  :order[1]
*/


正确的插入

insert into xml_schematest values(1,
'<Order>
<CustomerName>Bill Gates</CustomerName>
<OrderDate>2012-12-16T14:22:27.25Z</OrderDate>
<OrderAmt>100</OrderAmt>
</Order>'
)
insert into xml_schematest values(2,'
<Order>
<CustomerName>Stephen Zhou</CustomerName>
<OrderDate>2012-12-06T14:22:27.25Z</OrderDate>
<OrderAmt>200</OrderAmt>
</Order>'
)
select * from xml_schematest
/*
order_id    order_xml
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           <Order><CustomerName>Bill Gates</CustomerName><OrderDate>2012-12-16T14:22:27.25Z</OrderDate><OrderAmt>100</OrderAmt></Order>
2           <Order><CustomerName>Stephen Zhou</CustomerName><OrderDate>2012-12-06T14:22:27.25Z</OrderDate><OrderAmt>200</OrderAmt></Order>
(2 行受影响)
*/


 

--XML索引

 

建表插入数据

--XML索引
create table OrderXml(
orderdocid int primary key,
xOrders xml not null
)
insert into OrderXml values(1,'
<Orders>
<Order>
<Orderid>5</Orderid>
<CustomerName>Stephen</CustomerName>
<OrderAmount>12</OrderAmount>
</Order>
</Orders>
')
insert into OrderXml values(2,'
<Orders>
<Order>
<Orderid>6</Orderid>
<CustomerName>Jack</CustomerName>
<OrderAmount>13</OrderAmount>
</Order>
</Orders>
')
insert into OrderXml values(3,'
<Orders>
<Order>
<Orderid>7</Orderid>
<CustomerName>Jell</CustomerName>
<OrderAmount>14</OrderAmount>
</Order>
</Orders>
')


--创建索引如下:

create primary xml index  idx_l on OrderXml(xOrders)
select col.column_id,col.object_id,col.name,col.system_type_id 
from 
sys.columns col join sys.indexes idx on col.object_id=idx.object_id 
where
idx.name='idx_l' and idx.type=1
order by column_id
/*
column_id   object_id   name                                                                                                                             system_type_id
----------- ----------- -------------------------------------------------------------------------------------------------------------------------------- --------------
1           398624463   id                                                                                                                               165
2           398624463   nid                                                                                                                              56
3           398624463   tagname                                                                                                                          231
4           398624463   taguri                                                                                                                           231
5           398624463   tid                                                                                                                              56
6           398624463   value                                                                                                                            98
7           398624463   lvalue                                                                                                                           231
8           398624463   lvaluebin                                                                                                                        165
9           398624463   hid                                                                                                                              167
10          398624463   xsinil                                                                                                                           104
11          398624463   xsitype                                                                                                                          104
12          398624463   pk1                                                                                                                              56
(12 行受影响)
*/


 

 

--在主索引上创建XML索引

create xml index idx_a on orderxml(xorders)
using xml index idx_l for path
create xml index idx_b on orderxml (xorders)
using xml index idx_l for value
create xml index idx_c on orderxml (xorders)
using xml index idx_l for property

 

 

 


for xml raw

大体生成数据无格式表示,其中返回的行列变为每个元素的属性。

for xml auto 输出是分层的。

select * from sales for xml raw
/*
<row 商品名="x1" 公司="X" 类别="A" 价格="100" />
<row 商品名="x2" 公司="X" 类别="A" 价格="70" />
<row 商品名="x3" 公司="X" 类别="B" 价格="100" />
<row 商品名="y1" 公司="Y" 类别="A" 价格="60" />
<row 商品名="y2" 公司="Y" 类别="B" 价格="80" />
<row 商品名="y3" 公司="Y" 类别="C" 价格="100" />
<row 商品名="z1" 公司="Z" 类别="B" 价格="60" />
<row 商品名="z2" 公司="Z" 类别="B" 价格="80" />
<row 商品名="z3" 公司="Z" 类别="C" 价格="100" />
*/

 

 

新功能for xml path

用户把查询的结果自定义xml格式存入表或者传送

 

select 商品名 as [@商品名称],公司 as [公司类别/公司] ,类别 as [公司类别/类别]
,价格
from sales  for xml path
/*
<row 商品名称="x1">
<公司类别>
<公司>X</公司>
<类别>A</类别>
</公司类别>
<价格>100</价格>
</row>
<row 商品名称="x2">
<公司类别>
<公司>X</公司>
<类别>A</类别>
</公司类别>
<价格>70</价格>
</row>
<row 商品名称="x3">
<公司类别>
<公司>X</公司>
<类别>B</类别>
</公司类别>
<价格>100</价格>
</row>
<row 商品名称="y1">
<公司类别>
<公司>Y</公司>
<类别>A</类别>
</公司类别>
<价格>60</价格>
</row>
<row 商品名称="y2">
<公司类别>
<公司>Y</公司>
<类别>B</类别>
</公司类别>
<价格>80</价格>
</row>
<row 商品名称="y3">
<公司类别>
<公司>Y</公司>
<类别>C</类别>
</公司类别>
<价格>100</价格>
</row>
<row 商品名称="z1">
<公司类别>
<公司>Z</公司>
<类别>B</类别>
</公司类别>
<价格>60</价格>
</row>
<row 商品名称="z2">
<公司类别>
<公司>Z</公司>
<类别>B</类别>
</公司类别>
<价格>80</价格>
</row>
<row 商品名称="z3">
<公司类别>
<公司>Z</公司>
<类别>C</类别>
</公司类别>
<价格>100</价格>
</row>
*/


 

 


为输出的xml格式添加一个根元素 如下

select * from Trade  for xml path, root('Root')
/*
<Root>
<row>
<Symbol>ADVW</Symbol>
<Delta>5</Delta>
</row>
<row>
<Symbol>BYA</Symbol>
<Delta>-5</Delta>
</row>
<row>
<Symbol>NWT</Symbol>
<Delta>3</Delta>
</row>
</Root>
*/


生成内联架构

  select * from Trade  for xml auto, xmlschema


 

for xml auto ,elements生成基于元素的xml

 

 

 

 

使用OPENXML

declare @handle int
declare @xmlorder varchar(1000)
set @xmlorder='
<Root>
<Customer  CustomerID="BRU" ContactName="Andrew Brust">
<Order CustomerID="BRU" EmployeeID="5" OrderDate="2005-11-01">
<OrderDetail OrderID ="10248" ProductID="16" Quantity="12"/>
<OrderDetail OrderID ="10248" ProductID="32" Quantity="10"/>
</Order>
</Customer>
<Customer  CustomerID="ZAC" ContactName="Bill Zack">
<Order CustomerID="ZAC" EmployeeID="3" OrderDate="2005-11-16">
<OrderDetail OrderID ="10283" ProductID="99" Quantity="3"/>
</Order>
</Customer>
</Root>
'
execute sp_xml_preparedocument @handle output,@xmlorder
select * from 
openxml(@handle,'/Root/Customer',1) with (CustomerID varchar(10),ContactName varchar(10))
/*
CustomerID ContactName
---------- -----------
BRU        Andrew Bru
ZAC        Bill Zack
(2 行受影响)
*/


XML批量加载

 

CREATE TABLE TRADEXML (
CUSID INT PRIMARY KEY IDENTITY,
CUXML XML NOT NULL
)
INSERT INTO TRADEXML  SELECT * FROM    OPENROWSET(BULK 'D:/AA.XML',SINGLE_CLOB)AS DATAXML    


 

明天继续。。。。

 

 

 

 

 

 

 

*作者:Stephenzhou(阿蒙)     
 *日期: 2012.12.6
 *Mail:szstephenzhou@163.com     
 *另外:转载请著名出处。
 *博客地址:http://blog.csdn.net/szstephenzhou

 

 

 

这篇关于SQL Server2008 程序设计 XML的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786052

相关文章

SQL Server 中的表进行行转列场景示例

《SQLServer中的表进行行转列场景示例》本文详细介绍了SQLServer行转列(Pivot)的三种常用写法,包括固定列名、条件聚合和动态列名,文章还提供了实际示例、动态列数处理、性能优化建议... 目录一、常见场景示例二、写法 1:PIVOT(固定列名)三、写法 2:条件聚合(CASE WHEN)四、

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直