矩阵

来源:互联网 发布:为知笔记 设置密码 编辑:程序博客网 时间:2024/04/29 07:34
3:  
  将结果矩阵转置。  
  http://expert.csdn.net/Expert/topic/2390/2390314.xml?temp=.4681055  
  老衲:  
   
   
  if   exists   (select   *   from   sysobjects   where   id   =   object_id('proc_sky_blue')   and   xtype   ='P')  
  drop   proc   proc_sky_blue  
  go  
  create   proc   proc_sky_blue   (@tablename   varchar(200))  
  as  
  begin  
      set   nocount   on  
      declare   @col   nvarchar(256)  
      declare   @makesql   nvarchar(4000)  
      declare   @insertsql   nvarchar(4000)  
      declare   @caculatesql   nvarchar(400)  
      declare   @count   int  
      declare   @i   int  
      create   table   #tmp   (colname   nvarchar(20))  
      select   @caculatesql   =   'select   @count=count(1)   from   '   +   @tablename  
      exec   sp_executesql   @caculatesql,   N'@count   int   output',@count   output  
      if   @count   >=1024  
      begin  
          raiserror('表的行数太多了,我转不了',16,1)  
      end  
      else  
      begin  
          select   @i=0  
          while   @count   >0  
          begin  
              select   @i=@i+1  
              select   @makesql   =   'alter   table   #tmp   add   col'+convert(varchar(20),@i)+'   int'  
              exec(@makesql)  
              select   @count=@count-1          
          end  
          declare   my_cursor   cursor   for    
          select   name   from   syscolumns   where   id=object_id(@tablename)   order   by   colid  
          open   my_cursor  
          fetch   next   from   my_cursor   into   @col  
          while   @@fetch_status   =   0  
          begin  
              select   @makesql   ='select   @insertsql=   @insertsql   +   convert(varchar(4),'+@col+')   +'',''   from   '   +@tablename  
              select   @insertsql   =N'insert   #tmp   values   ('''+@col+   ''','  
              execute   sp_executesql   @makesql,N'@insertsql   nvarchar(4000)   output'   ,@insertsql   output  
              select   @insertsql   =   left(@insertsql,len(@insertsql)-1)   +')'  
              exec(@insertsql)  
              fetch   next   from   my_cursor   into   @col  
          end  
          close   my_cursor  
          deallocate   my_cursor  
          select   *   from   #tmp  
          set   nocount   off  
      end  
  end  
   
  go  
  ----------------分析  
  declare   @tablename   varchar(200)  
  set   @tablename='table1'  
  begin  
      set   nocount   on  
      declare   @col   nvarchar(256)  
      declare   @makesql   nvarchar(4000)  
      declare   @insertsql   nvarchar(4000)  
      declare   @caculatesql   nvarchar(400)  
      declare   @count   int  
      declare   @i   int  
      create   table   #tmp   (colname   nvarchar(20))  
      select   @caculatesql   =   'select   @count=count(1)   from   '   +   @tablename  
      exec   sp_executesql   @caculatesql,   N'@count   int   output',@count   output  
      if   @count   >=1024  
      begin  
          raiserror('表的行数太多了,我转不了',16,1)  
      end  
      else  
      begin  
          select   @i=0  
          while   @count   >0  
          begin  
              select   @i=@i+1  
              select   @makesql   =   'alter   table   #tmp   add   col'+convert(varchar(20),@i)+'   int'  
              exec(@makesql)  
              select   @count=@count-1          
          end  
          declare   my_cursor   cursor   for    
          select   name   from   syscolumns   where   id=object_id(@tablename)   order   by   colid  
          open   my_cursor  
          fetch   next   from   my_cursor   into   @col  
          while   @@fetch_status   =   0  
          begin  
              select   @makesql   ='select   @insertsql=   @insertsql   +   convert(varchar(4),'+@col+')   +'',''   from   '   +@tablename  
              select   @insertsql   =N'insert   #tmp   values   ('''+@col+   ''','  
              execute   sp_executesql   @makesql,N'@insertsql   nvarchar(4000)   output'   ,@insertsql   output  
              select   @insertsql   =   left(@insertsql,len(@insertsql)-1)   +')'  
              select   @insertsql  
              --exec(@insertsql)  
              fetch   next   from   my_cursor   into   @col  
          end  
          close   my_cursor  
          deallocate   my_cursor  
          select   *   from   #tmp  
          set   nocount   off  
          drop   table   #tmp  
      end  
  end
原创粉丝点击