日期:2014-05-17 浏览次数:20588 次
TableA Name Math English Physics Music 小明 78 88 91 89 小芳 81 87 76 80 小王 66 58 59 76 小李 99 77 89 85
TableB course 小明 小芳 小王 小李 Math 78 81 66 99 English 88 87 58 77 Physics 91 76 59 89 Music 89 80 76 85
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/ 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 + '+'',['' + [' + @fdname + ']+'']=''+cast([' + name + '] as varchar) 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 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 --创建测试数据 create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int) insert Test select '1月',100,200,300 union all select '2月',110,210,310 union all select '3月',120,220,320 union all select '4月',130,230,330 go --用上面的存储过程测试: exec p_zj 'Test', '月份' , '项目' drop table Test drop proc p_zj /* 项目 1月 2月 3月 4月 -------- ------ -------- -------- -------- 奖金 300 310 320 330 工资 100 110 120 130 福利 200 210 220 230 (所影响的行数为 3 行) */