SQL FOR XML

原文: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=‘10248‘UNION ALLSELECT TOP 5 2 AS Tag,1 AS Parent, NULL,NULL ,NULL,ProductID,UnitPrice,Quantity FROM dbo.[Order Details] WHERE OrderID=‘10248‘ 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

OK,今天就到这里吧,祝大家元旦快乐!

本作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,演绎或用于商业目的。但转载请注明来自崔江涛(KenshinCui),并包含相关链接。
时间: 2024-08-25 18:44:00

SQL FOR XML的相关文章

sql FOR XML PATH(&#39;&#39;)

alter function test() Returns nvarchar(max) As Begin Declare @avg nvarchar(max) Declare @str nvarchar(max) Set @str=( Select ','+yuanshidanhao from Aj_Jibenxinxi Where convert(nvarchar(max),id) in (1,2,6) FOR XML PATH('') ) Return @str End sql FOR XM

Oracle使用Sql把XML解析成表(Table)的方法

SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0" encoding="gb2312" ?> <DEAL_BASIC> <USER_DEAL_INFO> <USER_DEAL_ID>1000100001</USER_DEAL_ID> <DEAL_INURE_TIME>

Sql Server xml 类型字段的增删改查

1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需要写sql更新或插入. DECLARE @xml XML SET @xml=' <MyHobby> <MyCode>1</MyCode> <MyName>爬山</MyName> </MyHobby> <MyHobby> <

sql for xml 另一种写法(采用 tag 与 union all,简洁易懂)

测试环境:sql 08, 08 R2, 2010,  2012, 2014 等 declare @agent table ( AgentID int, Fname varchar(5), SSN varchar(11) ) insert into @agent select 1, 'Vimal', '123-23-4521' union all select 2, 'Jacob', '321-52-4562' union all select 3, 'Tom', '252-52-4563' de

将SQL for xml path(&#39;&#39;)中转义的字符正常显示

将SQL for xml path('')中转义的字符正常显示 在工作中出现的发送邮件的时候:因为邮件内容中有链接,并且多个拼接在一起的,于是用了for xml path().        但是,这样显示出来的链接时会将路径中的<,>,&符号转义为< > & 这样显示的路径在邮件中是不能进行链接的.         在网上查了很多资料后终于找到了一种方法:...FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)') 如下

SQL对Xml字段的操作

原文:SQL对Xml字段的操作 T-Sql操作Xml数据 一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB). 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中.

sql for xml 拼接相同类的列数据

数据库中记录着员工的工作经历,一个经历一条数据,现有一个需求要Excel导出员工的工作经历,所以就得把工作经历拼接在一起 测试的数据表如下 需要处理得到的结果如下(多个经历用了逗号隔开): SQL语句: SELECT empID, LEFT(workExperience,LEN(workExperience)-1) AS workExperience FROM ( SELECT empID,(SELECT Experience++',' FROM dbo.Employee WHERE empID

SQL - for xml path(&#39;&#39;) 实现多行合并到一行, 并带有分隔符

docs.microsoft.com 链接:  SQL一个应用场景与FOR XML PATH应用 首先呢!我们在增加一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么现在表结构如下: 这时,我们的要求是查询学生表,显示所有学生的爱好的结果集,代码如下: SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELE

SQL FOR XML PATH 和 Stuff 用法

sql stuff 用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,character_expression ) 3.示例 以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串 SELECT STUFF('abcdef', 2, 3, 'ijklmn')GO 下面是结果集 a