在sql server2000下用下面的存储过程可以满足你的需要,更改后可以实现更强的功能,
其中e1是原始表,e2根据e1建立,
[red]declare cc cursor scroll for select distinct a from e1[/red]
open cc /*建立游标并打开*/
declare @s char(2),@ss varchar(255)
fetch first from cc into @s
set @ss='create table e2(FF char(2),'
set @ss=@ss+@s+' char(2)'
while @@fetch_status=0
begin
fetch next from cc into @s
if @@fetch_status=0
set @ss=@ss++','+@s+' char(2)'
else
set @ss=@ss+')'
end
if not exists(select * from sysobjects where name='e2' )
exec(@ss) /*执行动态建立的sql语句,建立表e2*/
else begin
print('表已经存在,并将被删除')
drop table e2
exec(@ss)
end
declare @i integer,@cn varchar(127),@cv varchar(127),@tn varchar(127)
set @i=0
set @ss=''
set @cn=(select col_name(object_id('e1'),@i+1))
set @tn=@cn /*由于你上面所举示例有误,即数据转置后你又增加一个字段,造成字段名和*/
/*数据相差一行,此处用一临时变量存储以便满足数据的对应关系,*/
set @cn=(select col_name(object_id('e1'),@i+2))
while @cn is not null
begin
if exists(select * from sysobjects where name='tp' )
drop table tp
set @cv='select '+@cn+' into tp from e1'
exec(@cv)
declare tc cursor for select * from tp
open tc /*按临时表建立一个游标,遍历其每一行数据*/
set @ss='insert e2 values('+ ''''+@tn+''','
fetch next from tc into @cv
set @ss=@ss+''''+@cv+''''
while @@fetch_status=0
begin
fetch next from tc into @cv
if @@fetch_status=0
set @ss=@ss+','+ ''''+@cv+''''
else
set @ss=@ss+')'
end
exec(@ss) /*在e2中插入数据*/
close tc
deallocate tc
/*关闭并删除临时游标*/
set @i=@i+1
set @tn=@cn
set @cn=(select col_name(object_id('e1'),@i+2))
end
要验证以上sql语句,可以在库中建立一个表e1,其第一个字段为a就可以了(这是上面红字那行的限制,不过可以
更改一下使它通用,我没有时间了就没有改),然后在sql查询分析器中执行就可以得到一个表e2,可以查看此表中的
数据是否正确。
另外要想实现更高级的功能,可以将以上程序改为一个用户自定义函数,使它返回一个行集,这样
就可以直接用select语句返回想要的结果了。