日期:2014-05-17  浏览次数:20572 次

求修改一个列转行的语句.
代码是从网上抄来的.除了姓名,性别,地址这三列外,其它列不固定,有时多有时少.现要求把"姓名,性别,地址"三列不变,后面所有的列都转换成行.请教了.......

if object_id('[tb]') is not null drop table [tb]
create table tb(姓名 varchar(10) ,性别 varchar(2),地址 varchar(10), 语文 int , 数学 int , 物理 int)
insert into tb values('张三','男','广东',74,83,93)
insert into tb values('李四','女','深圳',74,84,94)
insert into tb values('张五','男','江西',74,84,94)
insert into tb values('杨六','女','北京',74,84,94)
insert into tb values('王四','男','大连',74,84,94)
go 

select * from tb

declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 ,性别,地址, [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns 
where name! = N'姓名 ,性别,地址' and ID = object_id('tb') 
order by colid asc
exec(@sql + ' order by 姓名 ,性别,地址') 

/*这样写报错:
服务器: 消息 245,级别 16,状态 1,行 1
将 varchar 值 '张三' 转换为数据类型为 int 的列时发生语法错误。
*/


------解决方案--------------------

where name! = N'姓名 ,性别,地址' and ID = object_id('tb') 

改为:

where name NOT IN ('姓名','性别','地址') and ID = object_id('tb') 

------解决方案--------------------
或者改成:
where name IN ('语文','数学','物理') and ID = object_id('tb')