SQL 2005,2008中生成XML结果集,for xml explicit

本文介绍如何在SQL Server 2005及2008中利用FOR XML AUTO、RAW和EXPLICIT三种方式生成XML结果集。通过示例代码详细展示了不同方法的特点,特别是FOR XML EXPLICIT的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL 2005,2008中生成XML结果集

自己也是刚学会,权作备注,如有错误,敬请请教

第一步部分:为演示造数据

SQL代码

ContractedBlock.gif ExpandedBlockStart.gif Code
declare @person table(
    ID 
int ,
    Name 
nvarchar(50null,
    Sex 
bit default(0null,
    Age 
int default(0null
)

insert into @person
select 1,'张三',0,26 union all
select 2,'李四',0,26 ;

declare @tech table(
    personID 
int not null,
    Tech 
nvarchar(50null
)
insert into @tech
select 1,'.net' union all
select 1,'javascript' union all
select 1,'sql' union all
select 2,'.net' union all
select 2,'javascript' union all
select 2,'sql' union all
select 2,'python' union all
select 2,'ruby';

第二部分:实战生成XML结果集,关键字:for xml auto,for xml raw,for xml explicit

最简单的生成XML结果集;
select * from @person for xml auto
select * from @person for xml raw
select * from @person for xml raw,root('person')
以上结果自己测试查看
关键在最后一方法上,for xml explicit,使用此模式你需要精确指定你要生成XML的结构,全部需要手动指定,相对比上面的麻烦些,
但却是最灵活的,相对麻烦些,也不算多么滴难, 关键就在理解那个TAG,和PARENT上,前者为表示节点,后者表示节点的父节点,
OK,天机已被我道破,下面看代码和结果集,有个直观的印象
SQL代码
ContractedBlock.gif ExpandedBlockStart.gif Code
select 
    
1 as tag,
    
null as parent,
    
null as [Name!1!],
    Name 
as [Name!1!Name],
    Sex 
as [Name!1!Sex],
    Age 
as [Name!1!Age]
from @person
for xml explicit,root('person')
结果:
ContractedBlock.gif ExpandedBlockStart.gif Code
<person>
  
<Name Name="张三" Sex="0" Age="26" />
  
<Name Name="李四" Sex="0" Age="26" />
</person>
似乎没什么,和前边的差不多的结果,至少也要有个子节点啥的,才能与上边的简单查询区分开吧,继续
SQL 代码:
ContractedBlock.gif ExpandedBlockStart.gif Code
with aaa as (
    
select 
        
1 as tag,
        
null as parent,
        id,
        
null as        [Name!1!],
        Name 
as        [Name!1!Name],
        Sex 
as        [Name!1!Sex],
        
        Age 
as        [Name!1!Age],
        
null as        [Tech!2!]
    
from @person

    
union all
    
select 
        
2 as tag,
        
1 as parent,
        personId,
        
null,
        
null,
        
null,
        
        
null,
        Tech
    
from @tech
)
select 
    tag,
    parent,
    
[Name!1!],
    
[Name!1!Name],
    
[Name!1!Sex],

    
[Name!1!Age],
    
[Tech!2!]
from aaa 
order by id,tag    
for xml explicit,root('person')
结果:
ContractedBlock.gif ExpandedBlockStart.gif Code
<person>
  
<Name Name="张三" Sex="0" Age="26">
    
<Tech>.net</Tech>
    
<Tech>javascript</Tech>
    
<Tech>sql</Tech>
  
</Name>
  
<Name Name="李四" Sex="0" Age="26">
    
<Tech>.net</Tech>
    
<Tech>javascript</Tech>
    
<Tech>sql</Tech>
    
<Tech>python</Tech>
    
<Tech>ruby</Tech>
  
</Name>
</person>

转载于:https://www.cnblogs.com/kkun/archive/2009/06/28/1512602.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值