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‘

declare @address table
 (
 AddressID int,
 AddressType varchar(12),
 Address1 varchar(20),
 Address2 varchar(20),
 City varchar(25),
 AgentID int
 )

insert into @address
 select 1, ‘Home‘, ‘abc‘, ‘xyz road‘, ‘RJ‘, 1 union all
 select 2, ‘Office‘, ‘temp‘, ‘ppp road‘, ‘RJ‘, 1 union all
 select 3, ‘Home‘, ‘xxx‘, ‘aaa road‘, ‘NY‘, 2 union all
 select 4, ‘Office‘, ‘ccc‘, ‘oli Com‘, ‘CL‘, 2 union all
 select 5, ‘Temp‘, ‘eee‘, ‘olkiu road‘, ‘CL‘, 2 union all
 select 6, ‘Home‘, ‘ttt‘, ‘loik road‘, ‘NY‘, 3

--SELECT
--	1 AS Tag,
--	NULL AS Parent,
--	0 AS ‘Agents!1!Sort!hide‘,
--	NULL AS ‘Agents!1!‘,
--	NULL AS ‘Agent!2!AgentID‘,
--	NULL AS ‘Agent!2!Fname!Element‘,
--	NULL AS ‘Agent!2!SSN!Element‘,
--	NULL AS ‘AddressCollection!3!Element‘,
--	NULL AS ‘Address!4!!xml‘,
--	NULL AS ‘Address!4!AddressType!Element‘,
--	NULL AS ‘Address!4!Address1!Element‘,
--	NULL AS ‘Address!4!Address2!Element‘,
--	NULL AS ‘Address!4!City!Element‘
--UNION ALL
--	SELECT
--	2 AS Tag,
--	1 AS Parent,
--	AgentID * 100,
--	NULL, AgentID, Fname, SSN,
--	NULL, NULL, NULL, NULL, NULL, NULL
--FROM @Agent
--UNION ALL
--	SELECT
--	3 AS Tag,
--	2 AS Parent,
--	AgentID * 100 + 1,
--	NULL,NULL,NULL,
--	NULL,
--	NULL,
--	NULL, NULL, NULL, NULL, NULL
--FROM @Agent
--UNION ALL
--SELECT
--	4 AS Tag,
--	3 AS Parent,
--	AgentID * 100 + 2,
--	NULL, NULL, NULL, NULL, NULL,
--	‘<!-- ‘ + AddressType + ‘ Address -->‘, AddressType,
--	Address1, Address2, City
--FROM @Address
--ORDER BY [Agents!1!Sort!hide]
--FOR XML EXPLICIT

SELECT
       1 AS Tag,
       NULL AS Parent,
       NULL AS [Agents!1!],
       NULL AS [Agent!2!AgentID],
       NULL AS [Agent!2!Fname!Element],
       NULL AS [Agent!2!SSN!Element],
       NULL AS [AddressCollection!3!Element],
       NULL AS [Address!4!AddressType!Element],
       NULL AS [Address!4!Address1!Element],
       NULL AS [Address!4!Address2!Element],
       NULL AS [Address!4!City!Element]

UNION ALL

SELECT
       2 AS Tag,
       1 AS Parent,
       NULL, AgentID, Fname, SSN,
       NULL,NULL, NULL, NULL, NULL
  FROM @Agent

UNION ALL

SELECT
       3 AS Tag,
       2 AS Parent,
       NULL,AgentID,NULL, NULL,
       NULL, NULL, NULL, NULL, NULL

  FROM @Agent

UNION ALL

SELECT
       4 AS Tag,
       3 AS Parent,
       NULL,AgentID,NULL,NULL,NULL,
       AddressType, Address1, Address2, City

  FROM @Address

 ORDER BY
       -- all properties of every agent
       -- (from tag 2 and 4: SSN, fname and adresses)
       -- will be sorted by agentID and combined into
       -- separate groups. It is necessary in same cases.
       [Agent!2!AgentID],
       [AddressCollection!3!Element], -- optional because NULL everywhere
       [Address!4!AddressType!Element]-- any ordering by elements of tag 4

FOR XML EXPLICIT
 

执行结果:

文章来源:http://social.msdn.microsoft.com/Forums/sqlserver/zh-CN/97f79941-324e-479e-ba5b-851cc534ebe5/problem-in-for-xml-explicit-query?

forum=sqlxml

时间: 2024-10-13 15:09:50

sql for xml 还有一种写法(採用 tag 与 union all,简洁易懂)的相关文章

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 存储过程 in 的两种写法

最近又忘记存储过程 除了exec 动态写法的另外一种,这里记录一下,方便查找 写法1,动态语句 CREATE PROCEDURE sp_CountShiftWish @strids varchar (1024) /*strids 是id列表, 类似1,2,3*/ AS exec ('select * from student where id in('[email protected]+')') go 写法2,索引查找 CREATE PROCEDURE sp_CountShiftWish @st

sql sever 的两种写法

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. 在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性: 一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理: 现在通过一个典型的银行转账的例子来说明一下这两个例子的用法 我们先来看看sql存储过程是如何来

SQL Server 存储过程的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

Android笔记---点击事件的四种写法

Android 点击事件的四种写法: 1. 以内部类的形式实现 OnClickListener 接口.定义点击事件 class MainActivity extents Activity{ // ... private class MyListener implements OnClickListener{ public void Onclick(View v){ // ... 点击事件的响应 } } } 2. 採用匿名内部类 ? ?缺点:若是点击事件太多,则须要的匿名内部类太多 class M

关于MyBatis的两种写法

刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml文件之后,在MyBatis基本配置文件指定好这个map文件的位置后就直接 User user = (User) session.selectOne("selectUser", "3"); 第二种就是 mapper接口式,叫做面向接口编程. 先定义一个UserMapper

Android点击事件的四种写法

Android点击事件的四种写法 一.Android点击事件的四种写法 1.点击事件的第一种写法 .  写一个内部类.实现点击事件的接口 bt.setOnClickListener(new MyButtonListener()); 2.点击事件的第二种写法,匿名内部类 bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); 3.点击事件的第三种

Android Listener侦听的N种写法

Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用,其接口定义如下: [java] view plaincopyprint? public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was cli

Android点击事件(click button)的四种写法

在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com.zdx.testdemo1; import javax.security.auth.PrivateCredentialPermission; import android.app.Activity;import android.os.Bundle;import android.view.Menu;i