日期:2014-05-18  浏览次数:20392 次

一个行列互转的存储过程问题
if   object_id( 'tb ')   is   not   null
        drop   table   tb
go
create   table   tb(
ID   int,
BusMan   varchar(10),
BusMan2   varchar(10),
BusMoney   int)

insert   into   tb   values(1, '郭芙蓉 ', 'null ',100)
insert   into   tb   values(2, '佟相玉 ', 'null ',100)
insert   into   tb   values(3, '郭芙蓉 ', '佟相玉 ',100)
insert   into   tb   values(4, '郭芙蓉 ', '王强 ',100)
insert   into   tb   values(5, '王强 ', 'null ',100)
insert   into   tb   values(6, '张飞 ', 'null ',100)

if   object_id( 'row_col_wrap ')   is   not   null
        drop   proc   row_col_wrap
go
create   proc   row_col_wrap
        @tablename   nvarchar(128)=null,@orderCol   nvarchar(128)
AS
declare   @rows   int,@cols   int
declare   @str   nvarchar(4000)
declare   @i   int,@j   int
declare   @colname   varchar(50)
declare   @value   varchar(8000)
declare   @r   varchar(8000)

set   @str=N 'select   @rows=count(1)   from   '+@tablename
exec   sp_executesql   @str,N '@rows   int   output ',@rows   output

set   @str=N 'select   @cols=count(1)   from   information_schema.columns   where   table_name= ' ' '+@tablename+N ' ' ' '
exec   sp_executesql   @str,N '@cols   int   output ',@cols   output
create   table   t(col1   varchar(100))

set   @i=2
while   @i <=@rows
begin
        set   @str=N 'alter   table   t   add   col '+cast(@i   as   varchar(2))+N '   varchar(100) '
        exec   sp_executesql   @str
        set   @i=@i+1
end

set   @i=1
while   @i <=@cols
begin
        set   @str=N 'select   @colname=column_name   from   information_schema.columns  
                                          where   table_name= ' ' '+@tablename+N ' ' '   and   Ordinal_Position= '+cast(@i   as   nvarchar(10))
        exec   sp_executesql   @str,N '@colname   varchar(50)   output ',@colname   output
        set   @r= ' '
        set   @j=0
        while   @j <@rows
        begin
                set   @str=N 'select   top   1   @value= '+@colname+N '   from   '+@tablename+N '   where   '+@colname+N '   not   in(select   top   '+cast(@j   as   nvarchar(10))+ '   '+@colname+N '   from   '+@tablename+N '   Order   by   '+@orderCol+N ') '
              &