您的位置:首页 > 数据库

MS_SQL SERVER 行列互换 通用版

2009-08-06 07:54 337 查看
新建测试表并插入相应数据

create table ttt
(
文理科   varchar(10),
全部人数 varchar(10),
最高分 varchar(10),
最低分 varchar(10),
平均分 varchar(10)
)
insert ttt select '文科','18','12','3','6.7'
union all select '理科','42','17','3','9.7'
union all select '全部','60','17','3','8.7'
go


行列互换存储过程

--DROP PROC p_zj

create proc p_zj
@tbname sysname,  --要处理的表名
@fdname sysname,  --做为转换的列名
@new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'='''+case isnull(@new_fdname,'') when '' then ''
else @new_fdname+'=' end+''''''+name+''''''''
,@s3=@s3+'
select @'+@i+'=@'+@i+'+'',[''+cast(['+@fdname+'] as varchar)+'']=''''''+replace(['+name+'],'''','''''''')+'''''''' from ['+@tbname+']'
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdname
order by colid

select @s1=substring(@s1,2,8000)
,@s2=substring(@s2,2,8000)
,@s4=substring(@s4,2,8000)
,@s5=substring(@s5,16,8000)

exec('declare '+@s1+'
select '+@s2+@s3+'
select '+@s4+'
exec('+@s5+')')

go
--//


调用存储过程

EXEC p_zj 'ttt','文理科','指标'


不会用的可以加我qq:449129942

保定-吴磊(保定银河卡电子有限公司)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: