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

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引