求修改一个列转行的语句.

W9757 2013-06-07 04:54:13
代码是从网上抄来的.除了姓名,性别,地址这三列外,其它列不固定,有时多有时少.现要求把"姓名,性别,地址"三列不变,后面所有的列都转换成行.请教了.......

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 的列时发生语法错误。
*/

...全文
126 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimk5200 2013-06-07
  • 打赏
  • 举报
回复
或者改成: where name IN ('语文','数学','物理') and ID = object_id('tb')
jimk5200 2013-06-07
  • 打赏
  • 举报
回复
1楼,正解, 其实你只要PRINT 你拼接的字符串就查到原因了
MrYangkang 2013-06-07
  • 打赏
  • 举报
回复
quotename(Name),,,quotename(Name,'''')
菜鸟之GrowUP 2013-06-07
  • 打赏
  • 举报
回复

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

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

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧