22,209
社区成员
发帖
与我相关
我的任务
分享
上午好象帮你写过.
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 tb(姓名 varchar(10),语文 int,英语 int,数学 int)
insert into tb values('张三' ,80 ,80 ,80 )
insert into tb values('李四' ,70 ,70 ,70 )
insert into tb values('王五' ,60 ,60 ,60 )
go
exec p_zj 'tb', '姓名' , '姓名'
drop table tb
drop proc p_zj
/*
姓名 张三 李四 王五
---- ----------- ----------- -----------
数学 80 70 60
英语 80 70 60
语文 80 70 60
(所影响的行数为 3 行)
*/
if object_id('ta')is not null drop table ta
go
create table ta(姓名 varchar(5), 语文 int, 英语 int, 数学 int)
insert ta select '张三', 80, 80, 80
insert ta select '李四', 70, 70, 70
insert ta select '王五', 60, 60, 60
if object_id('tempdb..#')is not null drop table #
go
select id=identity(int,1,1),姓名 into # from ta
declare @s varchar(8000)
declare @s1 varchar(8000)
declare @s2 varchar(8000)
declare @s3 varchar(8000)
select @s = isnull(@s+',','') + '[col'+ltrim(id)+'] = max(case when 姓名 = '''+ltrim(姓名) +''' then 姓名 else null end)'
from #
set @s = 'select ''姓名'' as col0 ,'+ @s + ' from ta union all '
select @s1 = isnull(@s1+',','') + '[col'+ltrim(id)+'] = max(case when 姓名 = '''+ltrim(姓名) +''' then ltrim(语文) else null end)'
from #
set @s1 = 'select ''语文'' as col0 ,'+ @s1 + ' from ta union all '
select @s2 = isnull(@s2+',','') + '[col'+ltrim(id)+'] = max(case when 姓名 ='''+ltrim(姓名) +''' then ltrim(英语) else null end)'
from #
set @s2 = 'select ''英语'' as col0 ,'+ @s2 + ' from ta union all '
select @s3 = isnull(@s3+',','') + '[col'+ltrim(id)+'] = max(case when 姓名 = '''+ltrim(姓名) +''' then ltrim(数学) else null end) '
from #
set @s3 = 'select ''数学'' as col0 ,'+ @s3 + ' from ta '
exec(@s+@s1+@s2+@s3)
/*col0 col1 col2 col3
---- ------------ ------------ ------------
姓名 张三 李四 王五
语文 80 70 60
英语 80 70 60
数学 80 70 60*/
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 tb(姓名 varchar(10),语文 int,英语 int,数学 int)
insert into tb values('张三' ,80 ,80 ,80 )
insert into tb values('李四' ,70 ,70 ,70 )
insert into tb values('王五' ,60 ,60 ,60 )
go
exec p_zj 'tb', '姓名' , '姓名'
drop table tb
drop proc p_zj
/*
姓名 张三 李四 王五
---- ----------- ----------- -----------
数学 80 70 60
英语 80 70 60
语文 80 70 60
(所影响的行数为 3 行)
*/