http://expert.csdn.net/Expert/topic/2303/2303308.xml?temp=.417721

解决方案 »

  1.   

    我运行了一遍你的例子,没问题呀,出来结果了。
    id        name    code       rk      jj      wh        td
    1 北京 010 1000 342 0 0
    2 上海 020 3402 80 0 0
    3 广州 021 2333 356 0 0
      

  2.   

    zjcxc(邹建) (
    你的
    第一种方法不行的,要判断多少个变量,麻烦
    第二种方法还是有 @sql 超过8000问题 LoveSQL(ligg) 
    要是单位有200个以上就不行了。
      

  3.   

    --楼主的这个,用我的化解方法就可以改成:--数据处理环境
    create table #Depart(ID int,Name varchar(10),Code varchar(10))
    insert #depart values(1,'北京','010')
    insert #depart values(2,'上海','020')
    insert #depart values(3,'广州','021')create table #Class(ID int,Name varchar(10),code varchar(10))
    insert #class values(1,'人口','rk')
    insert #class values(2,'经济','jj')
    insert #class values(3,'文化','wh')
    insert #class values(4,'土地','td')create table #Value(ID int,D_code varchar(10),C_Code varchar(10),Value int)
    insert #value values(1,'010','rk',1000)
    insert #value values(2,'020','rk',3402)
    insert #value values(3,'021','rk',2333)
    insert #value values(4,'010','jj',342)
    insert #value values(5,'020','jj',80)
    insert #value values(6,'021','jj',356)--数据处理,可以解决长度超长8000的问题.
    declare @sqlhead varchar(8000),@sqlend varchar(8000)
    ,@sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000),@sql4 varchar(8000)
    ,@i int,@ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0
    ,a=',['+code+']=sum(case b.c_code when '''
    +code+''' then b.value else 0 end)'
    into # from #Class--判断需要多少个变量来处理
    select @i=max(len(a)) from #
    set @i=7800/@i--分组临时表
    update # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''select a.id,a.name,a.code'''
    ,@sqlend=''' from #Depart a,#Value b where a.Code=b.d_Code group by a.id,a.code,a.name'''
    ,@sql1='',@sql2='select ',@sql3='',@sql4=''while @i>=0
    select @ic=cast(@i as varchar),@i=@i-1
    ,@sql1='@'+@ic+' varchar(8000),'+@sql1
    ,@sql2=@sql2+'@'+@ic+'='''','
    ,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
    +char(13)+@sql3
    ,@sql4=@sql4+',@'+@icselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13)
    ,@sql2=left(@sql2,len(@sql2)-1)+char(13)
    ,@sql3=left(@sql3,len(@sql3)-1)
    ,@sql4=substring(@sql4,2,8000)--执行
    exec( @sql1+@sql2+@sql3+'
    exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
    )--删除临时表
    drop table #value,#class,#depart,#
      

  4.   

    用我的化解方法,关键是下面两句:--生成数据处理临时表,修改a=后面的内容为相应的处理语句
    select id=identity(int,0,1),gid=0
    ,a=',['+code+']=sum(case b.c_code when '''
    +code+''' then b.value else 0 end)'
    into # from #Class--生成数据处理语句,将@sqlhead,@sqlend赋值为相应的处理语句头和尾
    select @sqlhead='''select a.id,a.name,a.code'''
    ,@sqlend=''' from #Depart a,#Value b where a.Code=b.d_Code group by a.id,a.code,a.name'''
    ,@sql1='',@sql2='select ',@sql3='',@sql4=''
      

  5.   

    不知道怎么回事,我和LoveSQL(ligg)一样,都能抛出同样的结果集
    没有出现变量超长的情况呀
      

  6.   

    用兩種方法可實現:一種就是將#Class,#Value 中的code值縮小。
    二種方法就是sum(case b.c_code when '''+code+''' then b.Value else 0 end) ['+code+']' from #Class中隻顯示一部分或100條記錄。其它數據再用另外一個表來實現。
    因為一個string中不能顯示如此多的數據。