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

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

时间: 2024-12-19 10:48:40

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 Server 存储过程的几种常见写法分析,我们该用那种写法

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

sql sever 的两种写法

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

无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)

1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM 的比较 3.常见adb指令 platform-tools/adb.exe adb.exe : android debug bridge android调试桥 adb devices:列出所以连接的设备 adb kill-server :杀死adb调试桥 adb start-server :启动adb

Android开发系列之按钮事件的4种写法

经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 方法1.

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模式返回表名为节点的元素,每一列

C#程序员学习Android开发系列之按钮事件的4种写法

经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 方法1.

关于MyBatis的两种写法

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