博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 输出 XML
阅读量:6943 次
发布时间:2019-06-27

本文共 4552 字,大约阅读时间需要 15 分钟。

一、概述

  SELECT 查询将结果作为行集返回。在 SQL 查询中指定 FOR XML 子句,从而将该查询的正式结果作为 XML 来检索。

  FOR XML 子句可以用在顶级查询和子查询中。顶级 FOR XML 子句只能用在 SELECT 语句中。而在子查询中,FOR XML 可以用在 INSERT、UPDATE 和 DELETE 语句中。它还可以用在赋值语句中。

  在 FOR XML 子句中,指定以下模式之一:

  1. RAW
  2. AUTO
  3. EXPLICIT
  4. PATH

 

  官方解释:

 

二、构造环境 

CREATE TABLE [dbo].[Customers](

    [CustomerId] [int] NOT NULL,
    [Name] [varchar](20) NOT NULL,
    [Country] [varchar](20) NOT NULL,
     CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED
    ( [CustomerId] ASC ) ON [PRIMARY]
) ON [PRIMARY]

insert Customers values(1,'Customer A','Australia')

insert Customers values(2,'Customer B','Australia')

CREATE TABLE [dbo].[Orders](

    [OrderId] [int] NOT NULL,
    [CustomerId] [int] NOT NULL,
    [OrderDate] [smalldatetime] NOT NULL,
    [Amount] [money] NOT NULL,
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
    ( [OrderId] ASC ) ON [PRIMARY]
) ON [PRIMARY] 

insert Orders values(1,1,'2000-01-01',3400)

insert Orders values(2,1,'2001-02-28',4300)

 

三、示例

1、FOR XML RAW

  RAW 模式将为 SELECT 语句所返回行集中的每行生成一个 <row> 元素。 可以通过编写嵌套 FOR XML 查询来生成 XML 层次结构。

SELECT OrderId, OrderDate, Amount, Name, Country

FROM Orders INNER JOIN Customers ON Orders.CustomerId = Customers.CustomerId
WHERE Customers.CustomerId = 1
FOR XML RAW

  结果为:

<row OrderId="1" OrderDate="2000-01-01T00:00:00" Amount="3400.0000" Name="Customer A" Country="Australia"/>

<row OrderId="2" OrderDate="2001-01-01T00:00:00" Amount="4300.0000" Name="Customer A" Country="Australia"/>
 

2、FOR XML AUTO

  AUTO 模式将基于指定 SELECT 语句的方式来使用试探性方法在 XML 结果中生成嵌套。 您对生成的 XML 的形状具有最低限度的控制能力。 除了 AUTO 模式的试探性方法生成的 XML 形状之外,还可以编写 FOR XML 查询来生成 XML 层次结构。

SELECT OrderId, OrderDate, Amount, Name, Country

FROM Orders INNER JOIN Customers ON Orders.CustomerId = Customers.CustomerId
WHERE Customers.CustomerId = 1
FOR XML AUTO 

  结果为:

<Orders OrderId="1" OrderDate="2000-01-01T00:00:00" Amount="3400.0000">

    <Customers Name="Customer A" Country="Australia"/>
</Orders>
<Orders OrderId="2" OrderDate="2001-02-28T00:00:00" Amount="4300.0000">
    <Customers Name="Customer A" Country="Australia"/>
</Orders>

  另例:

SELECT Name, Country, OrderId, OrderDate, Amount

FROM Orders INNER JOIN Customers ON Orders.CustomerId= Customers.CustomerId
WHERE Customers.CustomerId= 1
FOR XML AUTO

  结果为:

<Customers Name="Customer A" Country="Australia">

    <Orders OrderId="1" OrderDate="2000-01-01T00:00:00" Amount="3400.0000"/>
    <Orders OrderId="2" OrderDate="2001-02-28T00:00:00" Amount="4300.0000"/>
</Customers>

 

3、FOR XML EXPLICIT

  EXPLICIT 模式允许对 XML 的形状进行更多控制。 您可以随意混合属性和元素来确定 XML 的形状。 由于执行查询而生成的结果行集需要具有特定的格式。 此行集格式随后将映射为 XML 形状。 使用 EXPLICIT 模式能够随意混合属性和元素、创建包装和嵌套的复杂属性、创建用空格分隔的值(例如 OrderID 属性可能具有一列排序顺序 ID 值)以及混合内容。

  但是,编写 EXPLICIT 模式的查询会比较麻烦。 可以使用某些新的 FOR XML 功能(例如编写嵌套 FOR XML RAW/AUTO/PATH 模式查询和 TYPE 指令),而不使用 EXPLICIT 模式来生成层次结构。 嵌套 FOR XML 查询可以生成使用 EXPLICIT 模式可生成的任何 XML。 有关详细信息,请参阅使用嵌套 FOR XML 查询和 FOR XML 查询中的 TYPE 指令。

 

4、FOR XML PATH

  PATH 模式与嵌套 FOR XML 查询功能一起以较简单的方式提供了 EXPLICIT 模式的灵活性。 

SELECT Name AS '@Name', Country AS '@Country', OrderId, OrderDate, Amount

FROM Orders INNER JOIN Customers ON Orders.CustomerId= Customers.CustomerId
WHERE Customers.CustomerId= 1
FOR XML PATH ('Customers')

  结果为:

<Customers Name="Customer A" Country="Australia">

    <OrderId>1</OrderId>
    <OrderDate>2000-01-01T00:00:00</OrderDate>
    <Amount>3400.0000</Amount>
</Customers>
<Customers Name="Customer A" Country="Australia">
    <OrderId>2</OrderId>
    <OrderDate>2001-02-28T00:00:00</OrderDate>
    <Amount>4300.0000</Amount>
</Customers> 

 

四、ELEMENTS

  ELEMENTS指定列作为子元素返回,即 ELEMENTS 选项指定 XML 结果是以元素为中心的。否则,列将映射到 XML 属性。只在 RAW、AUTO 和 PATH 模式中支持该选项。

  示例1:

SELECT OrderId, OrderDate, Amount, Name, Country

FROM Orders INNER JOIN Customers ON Orders.CustomerXd - Customers.CustomerId
WHERE Customers.CustomerId= 1
FOR XML AUTO, ELEMENTS

  结果为:

<Orders>

    <OrderId>1</OrderId>
    <OrderDate>2000-01-01T00:00:00</OrderDate>
    <Amount>3400.0000</Amount>
    <Customers>
        <Name>Customer A</Name>
        <Country>Australia</Country>
    </Customers>
</Orders>
<Orders>
    <OrderId>2</OrderId>
    <OrderDate>2001-02-28T00:00:00</OrderDate>
    <Amount>4300.0000</Amount>
    <Customers>
        <Name>Customer A</Name>
        <Country>Australia</Country>
    </Customers>
</Orders>

  示例2:

SELECT Name, Country, OrderId, OrderDate, Amount

FROM Orders INNER JOIN Customers ON Orders.CustomerId= Customers.CustomerId
WHERE Customers.CustomerId= 1
FOR XML AUTO, ELEMENTS

  结果为:

<Customers>

    <Name>Customer A</Name>
    <Country>Australia</Country>
    <OrderId>1</OrderId>
    <Orders>
        <OrderDate>2000-01-01T00:00:00</OrderDate>
        <Amount>3400.0000</Amount>
    </Orders>
    <Orders>
        <OrderId>2</OrderId>
        <OrderDate>2001-02-28T00:00:00</OrderDate>
        <Amount>4300.0000</Amount>
    </Orders>
</Customers>

转载地址:http://uygjl.baihongyu.com/

你可能感兴趣的文章
云原生数据库如何打造业务弹性
查看>>
iOS,根据crash地址找出项目代码奔溃位置
查看>>
(三)spring cloud微服务分布式云架构 - Spring Cloud集成项目简介
查看>>
中国品牌建设蜗行牛步,消费者成最大突破口?
查看>>
朗玛信息互联网医疗生态圈背后是满满挑战?
查看>>
UIButton基本状态及各种叠加状态详解
查看>>
Java类集框架 —— HashMap源码分析
查看>>
直播项目---弹幕问题
查看>>
CPU发生异常到生成Crash Log的过程
查看>>
Zookeeper教程:快速开始以及结合java实现分布式Barrier和Queue
查看>>
JavaScript 笔记02
查看>>
分享一个前端视频资料的搜索引擎很给力
查看>>
MQ 常见的使用场景
查看>>
Java JDK11基于嵌套的访问控制
查看>>
js经验分享 JavaScript反调试技巧
查看>>
解--头条的算法面试题-圆环开关灯
查看>>
JS中typeof与instanceof的区别
查看>>
Redis 服务器安装
查看>>
前端进击的巨人(七):走进面向对象,原型与原型链,继承方式
查看>>
PAT A1116
查看>>