一个交叉表.用字段明做为值:原表数据为:
字段1 字段2 字段3
A1 B1 C1
A2 B2 C2
变换后:
COL1 COL2 COL3
字段1 A1 A2
字段2 B1 B2
字段3 C1 C2
create table tablename (字段1 varchar(100),字段2 varchar(100),字段3 varchar(100))
insert tablename select 'gsm900/1800mhz/gprs', '85*44*21mm', '80'
union all select 'gsm900/1800mhz/gprs' ,'82*46*21.5mm', '79'
go
SELECT top 0
字段名=a.name
into abc
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype='U' and d.name = 'tablename'
order by a.id,a.colorder
SELECT top 0
note =a.name
into abcd
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype='U' --表示用户类型
and d.name = 'tablename' -- 需要获取字段的表
order by a.id,a.colorder
declare @num int , @Col varchar(50) , @Name varchar(200), @Name1 varchar(200) , @count int , @num1 varchar(5)
select @num = 1
select @count = count(*) from tablename
while (@count > 0)
begin
select @Col = 'Col' + convert(varchar, @num)
exec('ALTER TABLE abc add [' + @Col + '] varchar(200) NULL ')
select @num = @num +1
set @count = @count - 1
end
DECLARE AddNameColumns_Cursor INSENSITIVE CURSOR --取字段值
FOR
SELECT
filedname = a.name
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype='U' and d.name = 'tablename'
order by a.id,a.colorder
OPEN AddNameColumns_Cursor
BEGIN
FETCH NEXT FROM AddNameColumns_Cursor INTO @Name --对应相应字段值
WHILE @@FETCH_STATUS = 0
BEGIN
insert into abc (字段名)
select fname = @Name
delete abcd
exec (' insert into abcd (note) select name = [' + @Name +'] from tablename ')
select @num = 1
DECLARE AddNameColumns_Cursor1 INSENSITIVE CURSOR
FOR select note from abcd
OPEN AddNameColumns_Cursor1
BEGIN
FETCH NEXT FROM AddNameColumns_Cursor1 INTO @Name1
WHILE @@FETCH_STATUS = 0
BEGIN
select @num1 = convert(varchar, @num)
exec('update abc set [Col'+ @num1 + '] = ''' + @Name1+''' where 字段名='''+ @Name +'''')
print 'update abc set [' + @Col + '] = ''' + @Name1+''' where 字段名='''+ @Name +''''
select @num = @num +1
FETCH NEXT FROM AddNameColumns_Cursor1 INTO @Name1
END
END
CLOSE AddNameColumns_Cursor1
DEALLOCATE AddNameColumns_Cursor1
FETCH NEXT FROM AddNameColumns_Cursor INTO @Name
END
END
CLOSE AddNameColumns_Cursor
DEALLOCATE AddNameColumns_Cursor
select * from abc
SELECT * FROM tablename
drop table tablename
drop table abc
drop table abcd