【转】SQL FOR XML简介及用法
摘要:sql中的for xml语法为表转化为xml提供了很好的支持,当然使用同样的程序语言也能够达到同样的效果,但是有了for xml将使得这一切更加的方便。
主要内容:
Select 的查询结果会作为行集返回,但是你同样可以在sql中指定for xml子句使得查询作为xml来检索。在for xml子句中,可以指定以下模式之一:RAW 、AUTO、EXPLICIT和PATH。
RAW模式返回行为元素,每一列的值作为元素的属性;AUTO模式返回表名为节点的元素,每一列的属性作为属性输出;EXPLICIT模式通过SELECT语法定义输出XML结构;PATH模式中列名或列别名作为XPATH表达式来处理。
下面是四种方式输出的效果
RAW模式

SELECT TOP 5 ProductName,UnitPrice FROM dbo.Products FOR XML RAW

查询结果

<row ProductName="Chai" UnitPrice="18.0000" /> <row ProductName="Chang" UnitPrice="19.0000" /> <row ProductName="Aniseed Syrup" UnitPrice="10.0000" /> <row ProductName="Chef Anton's Cajun Seasoning" UnitPrice="22.0000" /> <row ProductName="Chef Anton's Gumbo Mix" UnitPrice="21.3500" />

AUTO模式

SELECT TOP 5 ProductName,UnitPrice FROM dbo.Products FOR XML AUTO

查询结果

<dbo.Products ProductName="Chai" UnitPrice="18.0000" /> <dbo.Products ProductName="Chang" UnitPrice="19.0000" /> <dbo.Products ProductName="Aniseed Syrup" UnitPrice="10.0000" /> <dbo.Products ProductName="Chef Anton's Cajun Seasoning" UnitPrice="22.0000" /> <dbo.Products ProductName="Chef Anton's Gumbo Mix" UnitPrice="21.3500" />

EXPLICIT模式

SELECT TOP 5 1 AS Tag,0 AS Parent, OrderID AS [Order!1!ID],OrderDate AS [Order!1!Date],CustomerID AS [Order!1!Customer],NULL AS [OrderDetail!2!ProductID],NULL AS [OrderDetail!2!UnitPrice],NULL AS [OrderDetail!2!Quantity] FROM dbo.Orders WHERE dbo.Orders.OrderID='' UNION ALL SELECT TOP 5 2 AS Tag,1 AS Parent, NULL,NULL ,NULL,ProductID,UnitPrice,Quantity FROM dbo.[Order Details] WHERE OrderID='' FOR XML EXPLICIT

查询结果

<Order ID="10248" Date="1996-07-04T00:00:00" Customer="VINET"> <OrderDetail ProductID="11" UnitPrice="14.0000" Quantity="12" /> <OrderDetail ProductID="42" UnitPrice="9.8000" Quantity="10" /> <OrderDetail ProductID="72" UnitPrice="34.8000" Quantity="5" /> </Order>

PATH模式

SELECT TOP 5 ProductName AS Name, UnitPrice AS Price FROM dbo.Products FOR XML PATH('Cmj')

查询结果

<Cmj> <Name>Chai</Name> <Price>18.0000</Price> </Cmj> <Cmj> <Name>Chang</Name> <Price>19.0000</Price> </Cmj> <Cmj> <Name>Aniseed Syrup</Name> <Price>10.0000</Price> </Cmj> <Cmj> <Name>Chef Anton's Cajun Seasoning</Name> <Price>22.0000</Price> </Cmj> <Cmj> <Name>Chef Anton's Gumbo Mix</Name> <Price>21.3500</Price> </Cmj>

RAW模式和AUTO模式相对比较简单,灵活性当然也是比较差的。EXPLICIT模式会将查询执行生成的行集转换为XML文档,也就是说结构可以自定义,当然这必须符合一定的格式。就拿上面的语句来说:
Tag指定生成节点的嵌套级别,列名必须为"Tag"例如上面的级别为1。
Parent指定当前Tag的父级层次,列名必须为"Parent",NULL表示顶级。
其他列名,例如[Order!1!ID]分别代表元素名称、Tag标记(也就是层级)、属性名称。例如上面的这一列就代表会在第一级节点中生成一个节点名称为Order的节点并且有一个属性ID。
此外还需要指出的是这个列名还有一个可选部分,完整的形式是[ElementName!TagNumber!AttributeName!Directive],最后一部分Directive是可选的,如果不指定的话默认作为ElementName中的属性名称;当然如果制定了xml、cdata或者element那么它将作为ElementName的一个子元素而不是属性。并且指定了此选项之后AttributeName可以为空。
上面的例子中如果去掉For XML EXPLICIT之后查询到的数据时如下形式:

按照上面的规则不难看出,FOR XML EXPLICIT会按照顺序生成xml:
第一次执行(第一行数据)时tag为1,parent为0,则此时会按照列名创建一个Order节点,并依次创建三个属性:ID、Date和Customer,其值为:10248、1996-07-04 00:00:00.000、VINET。此时不会生成ProductID属性,因为它的Tag为2,需要在第二级节点中创建,其他另个属性也是如此。
第二次执行(第二行数据)时Tag为2,Parent为1,也就是要在Tag为1的节点中创建一个2级节点。然后根据查找列名中Tag为2的列,依次创建ProductID、UnitPrice、Quantity属性,并赋值。
第三次、第四次同第二次执行类似,不同的只是数据而已。
PATH模式应该说是使用率相当高的,原因比较简单,它的使用既简单又灵活。在PATH模式中,节点名称可以使列名也可以通过别名指定又或者根本不指定,不指定的情况下就只显示节点内数据;根节点可以指定也可以不指定,不指定情况下默认为"row",并且根节点指定为""的情况下可以完全取消根节点的显示。有了这一属性就可以使用PATH模式完成很多有用的操作。
没有指定根节点时:

SELECT TOP 5 ProductName FROM dbo.Products FOR XML PATH


<row> <Name>Chai</Name> <Price>18.0000</Price> </row> <row> <Name>Chang</Name> <Price>19.0000</Price> </row> <row> <Name>Aniseed Syrup</Name> <Price>10.0000</Price> </row> <row> <Name>Chef Anton's Cajun Seasoning</Name> <Price>22.0000</Price> </row> <row> <Name>Chef Anton's Gumbo Mix</Name> <Price>21.3500</Price> </row>

去掉根节点名称:

SELECT TOP 5 ProductName FROM dbo.Products FOR XML PATH('')


<ProductName>Alice Mutton</ProductName> <ProductName>Aniseed Syrup</ProductName> <ProductName>Boston Crab Meat</ProductName> <ProductName>Camembert Pierrot</ProductName> <ProductName>Carnarvon Tigers</ProductName>

去掉根节点和子节点名称:

SELECT TOP 5 ProductName+'' FROM dbo.Products FOR XML PATH('')


Alice MuttonAniseed SyrupBoston Crab MeatCamembert PierrotCarnarvon Tigers

可以发现去掉节点名称之后for xml path起到了字符串连接的作用,这样一来就可以利用这一特性完成字符串拼接,例如下面的语句就能完成可以将五种产品用","进行分割的功能:

SELECT LEFT(ProductNames,(LEN(ProductNames)-1)) FROM( SELECT (SELECT TOP 5 ProductName+',' FROM dbo.Products FOR XML PATH('')) AS ProductNames ) AS T

【转】SQL FOR XML简介及用法的更多相关文章
- SQLServer中sql for xml path 的用法
我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- MSSQL Sql加密函数 hashbytes 用法简介
转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashbytes函数功能为:返回一个字符,通过 MD2.MD4.MD5. ...
- SQL Profiler工具简介
一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问 ...
- SQL 语句及关键字的用法
一.SELECT select [ALL|DISTINCT] select_list [into new table] FROM table_source [where serch_conditaio ...
- sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
- Sql Server xml 类型字段的增删改查
1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...
- XML 参考:XML基础 XML 简介
XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...
- Cwinux简介及用法简述
我在我的个人博客上发表了一篇文章 Cwinux简介及用法简述 http://apprentice89.com/cwinux_introduction_and_use/
随机推荐
- 35-面试:如何找出字符串的字典序全排列的第N种
http://www.cnblogs.com/byrhuangqiang/p/3994499.html
- 【原创】VB超强游戏外挂帮助类,封装了很多方法
''' <summary> ''' a very nice file that can be used on other projects ''' </summary> ''' ...
- Python高级用法篇——笔记
1.Python3字典中items()和python2.x中iteritems()的区别 在Python2.x中,items( )用于 返回一个字典的拷贝列表[Returns a copy of th ...
- linux下一些常用系统命令
查看系统打开的文件数 lsof|wc -l 查看当前目录下的文件数 find -type f | wc -l 查看某个目录下的文件数,注意这里/home包括其所有子目录 find /home -typ ...
- Linux tcpdump命令
一.简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据 ...
- ubuntu下常用操作
屏幕截图: 可以用ubuntu自带的截图软件:gnome-screenshot. 该工具截图区域并且复制到剪切板命令为 gnome-screenshot -c -a,可以给该命令添加快捷方式,alt ...
- div浮停在页面最上或最下
div{ position:fixed; bottom:0px; // top:0px; z-index:999; } bottom:0px 浮停在最下面,top:0px 浮停在最上面:z-index ...
- js如何实现网站title的滚动效果
var text=document.title;//获得页面的标题 var timerID;//定时器 function newtext() { ...
- 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)
传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...
- 2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)
传送门 dp好题. 先推出对于每一行花费k次能最多粉刷的格子数. 然后再推前i行花费k次能最多粉刷的格子数. 代码: #include<bits/stdc++.h> #define N 5 ...