首页 > 技术文章 > for xml path

liu-shiliu 2016-06-01 14:49 原文

测试建表

create table WebNewsInfo
(
ID int identity(1,1),
NewsTitle varchar(32) not null,
HotFlag tinyint not null
)
alter table WebNewsInfo add constraint PK_WebNewsInfo_ID  primary key(ID)

insert into WebNewsInfo values('测试1',1)
insert into WebNewsInfo values('测试2',0)

select * from WebNewsInfo


要将两条数据合并成一条显示<p head="Hot" hcolor="0xffff00" content="测试1"/><p head="New" hcolor="0xffff00" content="测试2"/>,而且只显示出一条

select (select '<p head="'+(CASE when HotFlag=1 THEN 'Hot' else 'New' END )
+'" hcolor="0xffff00" content="'+NewsTitle+'"/>'
from WebNewsInfo
for xml path('')
)
from  WebNewsInfo 

这样写会显示两条数据,而且> <都被转义了

select '<p head="'+(CASE when HotFlag=1 THEN 'Hot' else 'New' END )
+'" hcolor="0xffff00" content="'+NewsTitle+'"/>'
from WebNewsInfo
for xml path('')

这样写> <都被转义了,而且是xml的形式

select  stuff((select '<p head="'+(CASE when HotFlag=1 THEN 'Hot' else 'New' END )
+'" hcolor="0xffff00" content="'+NewsTitle+'"/>'
from WebNewsInfo
for xml path('')),1, 0, '')

这样写不是xml格式了,但是还是没有解决转义的问题

select
(
    select '<p head="'+(CASE when HotFlag=1 THEN 'Hot' else 'New' END )
    +'" hcolor="0xffff00" content="'+NewsTitle+'"/>'
    from WebNewsInfo
    FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)') --防止转义

这样写就可以实现要求

 select stuff((select convert(varchar(20),ID)+':'+NewsTitle+';' from WebNewsInfo FOR XML PATH('')),1, 0, '')

用这个语句可以实现列转行

 

此外,要实现行转列,可以采用split函数的实现方法

 

推荐阅读