--楼主的这个,用我的化解方法就可以改成:--数据处理环境 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,#
用我的化解方法,关键是下面两句:--生成数据处理临时表,修改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=''
不知道怎么回事,我和LoveSQL(ligg)一样,都能抛出同样的结果集 没有出现变量超长的情况呀
用兩種方法可實現:一種就是將#Class,#Value 中的code值縮小。 二種方法就是sum(case b.c_code when '''+code+''' then b.Value else 0 end) ['+code+']' from #Class中隻顯示一部分或100條記錄。其它數據再用另外一個表來實現。 因為一個string中不能顯示如此多的數據。
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
你的
第一种方法不行的,要判断多少个变量,麻烦
第二种方法还是有 @sql 超过8000问题 LoveSQL(ligg)
要是单位有200个以上就不行了。
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,#
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=''
没有出现变量超长的情况呀
二種方法就是sum(case b.c_code when '''+code+''' then b.Value else 0 end) ['+code+']' from #Class中隻顯示一部分或100條記錄。其它數據再用另外一個表來實現。
因為一個string中不能顯示如此多的數據。