业务场景: 实现一个表中,从第几列开始,以后列都转为行
不逼逼多,上货
create PROCEDURE [dbo].[proc_unpivot]
(@tableName varchar(50), --@tableName 表名
@num varchar(50) ) --@num 从那一列开始,列变行
AS
BEGIN
declare @LieName varchar(50)
declare @LieName2 varchar(50)
declare @sql varchar(max)
declare @sql2 varchar(max)
declare @Zsql varchar(max)
set @sql=''
set @sql2=''
if(SUBSTRING(@TableName,0,7)='[dbo].')
begin
set @TableName=SUBSTRING(@TableName,8,len(@TableName)-8)
end
else
begin
set @TableName=@TableName
end
--第1个游标
declare My_Cursor CURSOR for
select name from syscolumns
Where ID=OBJECT_ID(@tableName)
and colid<@num
order by colid
Open My_Cursor
fetch next from My_Cursor into @LieName
while @@fetch_status=0
begin
set @sql=@sql+'
'+@LieName+','
fetch next from My_Cursor into @LieName
end
Close My_Cursor
Deallocate My_Cursor
--set @sql=SUBSTRING(@sql,1,LEN(@sql)-1)
---第2个游标
declare My_Cursor2 CURSOR for
select name from syscolumns
Where ID=OBJECT_ID(@tableName)
and colid>=@num
order by colid
Open My_Cursor2
fetch next from My_Cursor2 into @LieName2
while @@fetch_status=0
begin
set @sql2=@sql2+@LieName2+','
fetch next from My_Cursor2 into @LieName2
end
Close My_Cursor2
Deallocate My_Cursor2
set @sql2=SUBSTRING(@sql2,1,LEN(@sql2)-1)
--print @sql2
set @Zsql='select'+@sql+'
数量,'+'
列名称'+'
from '+@tableName +'
unpivot (数量 for 列名称 in('+@sql2+')) N'
print @Zsql
exec(@Zsql)
END
这是我写的存储过程,你只需拷过去
然后 运行 exec proc_unpivot @tablename,@num
@tablename意思:表名
@num 意思:从这个表中,第几列开始以后列都转行。包括此列
如: exec proc_unpivot ‘表名A’,2 ,意思: 从表名A开始 第2列开始,以后列都转行,包括第2列