4的存储过程应该是:
CREATE PROCEDURE dbo.KeHuXSJDTJ @strdate1 varchar(20),
@strDate2 varchar(20),
@GuestType varchar(20) as
declare @s varchar(8000)
set @s=''
select @s=@s+',['+rtrim(A.F_cKeHuBM)+'||本日发货]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nBenRiFHJE else 0 end)'
+',['+rtrim(A.F_cKeHuBM)+'||发货累计]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nLeiJiFHJE else 0 end)'
+',['+rtrim(A.F_cKeHuBM)+'||本日预收]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nBenRiYSHK else 0 end)'
+',['+rtrim(A.F_cKeHuBM)+'||预收累计]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nLeiJiYSJE else 0 end)'
+',['+rtrim(A.F_cKeHuBM)+'||剩余货款]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nShengYuHK  else 0 end)'
from tb_nKeHuXSJDB A,tb_nKeHuZLB B
where A.F_cKeHuBM=B.F_cBianMa
and B.F_cLeiBie = ''''+@GuestType+''''
group by A.F_cKeHuBM
exec('select A.F_cRiQi as 日期'+@s+' from tb_nKeHuXSJDB A where A.F_cRiQi >= '''+@strdate1+'''  and A.F_cRiQi <= '''+@strDate2+''' group by A.F_cRiQi')
GO

解决方案 »

  1.   

    出错的原因是:declare @s varchar(8000)超出截尾了
    解决方法:
    1、先减少无用的空格,节省空间
    CREATE PROCEDURE dbo.KeHuXSJDTJ @strdate1 varchar(20),
    @strDate2 varchar(20) AS
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
    from tb_nKeHuXSJDB
    group by F_cKeHuBM
    exec('select F_cRiQi as 日期'+@s+' from tb_nKeHuXSJDB where F_cRiQi >= '''+@strdate1+'''  and F_cRiQi <= '''+@strDate2+''' group by F_cRiQi')
    GO
      

  2.   

    2、如果还超出,用多个变量
    CREATE PROCEDURE dbo.KeHuXSJDTJ @strdate1 varchar(20),
    @strDate2 varchar(20) AS
    declare @s varchar(8000)
    declare @s1 varchar(8000)
    declare @s2 varchar(8000)
    declare @s3 varchar(8000)
    declare @s4 varchar(8000)
    set @s=''
    set @s1=''
    set @s2=''
    set @s3=''
    set @s4=''select F_cKeHuBM into #t 
    from tb_nKeHuXSJDB
    group by F_cKeHuBMwhile len(@s)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s=@s+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s1)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s1=@s1+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s2)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s2=@s2+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s3)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s3=@s3+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s4)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s4=@s4+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endexec('select F_cRiQi as 日期'+@s+@s1+@s2+@s3+@s4+' from tb_nKeHuXSJDB where F_cRiQi >= '''+@strdate1+'''  and F_cRiQi <= '''+@strDate2+''' group by F_cRiQi')
    GO--挺笨的方法
      

  3.   

    加删除临时表CREATE PROCEDURE dbo.KeHuXSJDTJ @strdate1 varchar(20),
    @strDate2 varchar(20) AS
    declare @s varchar(8000)
    declare @s1 varchar(8000)
    declare @s2 varchar(8000)
    declare @s3 varchar(8000)
    declare @s4 varchar(8000)
    set @s=''
    set @s1=''
    set @s2=''
    set @s3=''
    set @s4=''select F_cKeHuBM into #t 
    from tb_nKeHuXSJDB
    group by F_cKeHuBMwhile len(@s)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s=@s+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s1)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s1=@s1+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s2)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s2=@s2+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s3)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s3=@s3+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    endwhile len(@s4)<=7500 and exists (select * from #t)
    begin
      set rowcount 1
      select @s4=@s4+',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+rtrim(F_cKeHuBM)+''' then F_nShengYuHK  else 0 end)'
      from #t
      delete #t
      set rowcount 0
    enddrop table #texec('select F_cRiQi as 日期'+@s+@s1+@s2+@s3+@s4+' from tb_nKeHuXSJDB where F_cRiQi >= '''+@strdate1+'''  and F_cRiQi <= '''+@strDate2+''' group by F_cRiQi')
    GO
      

  4.   

    to 99831323(99831323):
    我试了你的方法,还是提示错误
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: ',' 附近有语法错误。我想用另外一种方式解决,即用客户类别限制每次显示的用户数,其存取过程为:
    CREATE PROCEDURE dbo.KeHuXSJDTJ @strdate1 varchar(20),
    @strDate2 varchar(20),
    @GuestType varchar(20) as
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+rtrim(A.F_cKeHuBM)+'||本日发货]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nBenRiFHJE else 0 end)'
    +',['+rtrim(A.F_cKeHuBM)+'||发货累计]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(A.F_cKeHuBM)+'||本日预收]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nBenRiYSHK else 0 end)'
    +',['+rtrim(A.F_cKeHuBM)+'||预收累计]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(A.F_cKeHuBM)+'||剩余货款]=sum(case A.F_cKeHuBM when '''+A.F_cKeHuBM+''' then A.F_nShengYuHK  else 0 end)'
    from tb_nKeHuXSJDB A,tb_nKeHuZLB B
    where A.F_cKeHuBM=B.F_cBianMa
    and B.F_cLeiBie = ''''+@GuestType+''''
    group by A.F_cKeHuBM
    exec('select A.F_cRiQi as 日期'+@s+' from tb_nKeHuXSJDB A where A.F_cRiQi >= '''+@strdate1+'''  and A.F_cRiQi <= '''+@strDate2+''' group by A.F_cRiQi')
    GO
    但结果仅仅显示1列日期,但数据应该有的。请问是什么问题?
      

  5.   

    CREATE PROCEDURE dbo.KeHuXSJDTJ 
    @strdate1 varchar(20),
    @strDate2 varchar(20) 
    AS
    declare @sqlhead nvarchar(4000),@sqlend nvarchar(4000)
    ,@sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
    ,@i int,@ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0
    ,a=',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nShengYuHK  else 0 end)'
    into # from(select distinct F_cKeHuBM from tb_nKeHuXSJDB) a--判断需要多少个变量来处理
    select @i=max(len(a)) from #
    set @i=3800/@i--分组临时表
    update # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''select F_cRiQi as 日期'''
    ,@sqlend=''' from tb_nKeHuXSJDB where F_cRiQi >= '''''+@strdate1+'''''  and F_cRiQi <= '''''+@strDate2+''''' group by F_cRiQi'''
    ,@sql1='',@sql2='select ',@sql3='',@sql4=''while @i>=0
    select @ic=cast(@i as varchar),@i=@i-1
    ,@sql1='@'+@ic+' nvarchar(4000),'+@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,4000)--执行
    exec( @sql1+@sql2+@sql3+'
    exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
    )
    GO
      

  6.   

    每个 SELECT 语句的列数 4,096 用我的存储过程,只要楼主生成的列不超过上述sql的规定,就不会有问题.
      

  7.   

    to  zjcxc(邹建):下面是执行结果.
    (所影响的行数为 21 行)
    (所影响的行数为 21 行)服务器: 消息 170,级别 15,状态 1,行 2
    第 2 行: ',' 附近有语法错误。
      

  8.   

    测试语句:
    execute KeHuXSJDTJ86 '2004-01-01','2004-10--10'表结构及数据:
    F_cRiQi F_cKeHuBM  F_nBenRiYSHK F_nShengYuHK F_nBenRiFHJE F_nLeiJiFHJE F_nLeiJiYSJE
    2004-07-12 C0169 0 90860 29140 29140 120000
    2004-06-22 C0169 120000 120000 0 0 120000
    2004-07-05 C0170 50000 50000 0 0 50000
    2004-07-02 C0171 20000 20000 0 0 20000
    2004-08-11 C0148 0 140904 9096 9096 150000
    2004-07-27 C0169 0 -108640 199500 228640 120000
    2004-08-07 C0174 0 -10296 10296 10296 0
    2004-08-09 C0175 0 -4117.5 4117.5 4117.5 0
    2003-08-09 C0175 0 0 0 0 0
    2004-08-17 C0174 0 -84861.6 0 84861.6 0
    2004-08-14 C0174 0 -84861.6 74565.6 84861.6 0
    2004-08-12 C0176 0 -7680 7680 7680 0
    2004-08-16 C0176 0 -10880 3200 10880 0
    2004-08-13 C0177 60600 60600 0 0 60600
    2004-08-19 C0169 100000 -168349.6 159709.6 388349.6 220000
    2004-08-27 C0169 0 -168349.6 0 388349.6 220000
    2004-08-18 C0172 0 33004.8 23755.2 23755.2 56760
    2004-08-18 C0181 0 -385.8 385.8 385.8 0
    2004-08-23 C0173 0 -49280 69280 69280 20000
    2004-08-23 C0148 0 -42171.2 183075.2 192171.2 150000
    2004-08-28 C0197 0 -14160 14160 14160 0
    2004-08-26 C0182 0 -22742.8 13541.24 22742.8 0
    2004-08-31 C0207 0 17607.2 392.8 392.8 18000
    2004-08-27 C0181 0 -114518.6 114132.8 114518.6 0
    2004-08-29 C0151 0 -1335.8 1335.8 1335.8 0
    2004-08-28 C0149 0 -34680 34680 34680 0
    2004-08-29 C0149 0 -47980 13300 47980 0
    2004-08-31 C0209 0 -3094.56 3094.56 3094.56 0
    2004-08-23 C0176 0 -12160 1280 12160 0
    2004-08-30 C0211 0 0 0 0 0
    2004-08-30 C0215 66000 66000 0 0 66000
    2004-08-30 C0207 18000 18000 0 0 18000
    2004-08-31 C0091 50000 33480 11420 16520 50000
    2004-08-31 C0172 0 -83770.54 116775.34 140530.54 56760
    2004-09-01 C0091 0 32100 1380 17900 50000
    2004-09-01 C0153 0 -2560 2560 2560 0
    2004-09-03 C0091 0 21708 10392 28292 50000
    2004-09-05 C0091 0 -2660 7600 52660 50000
    2004-07-15 C0172 56760 56760 0 0 56760
    2004-07-23 C0148 150000 150000 0 0 150000
    2004-07-27 C0173 20000 20000 0 0 20000
    2004-08-18 C0177 0 41017.62 19582.38 19582.38 60600
    2004-08-20 C0182 0 -9201.56 9201.56 9201.56 0
    2005-08-20 C0182 0 -22742.8 0 22742.8 0
    2004-08-20 C0175 30000 25882.5 0 4117.5 30000
    2004-09-03 C0207 0 17607.2 0 392.8 18000
    2004-08-30 C0091 0 -5100 5100 5100 0
    2004-08-31 C0170 0 -7000 57000 57000 50000
    2004-09-04 C0153 0 -11940 9380 11940 0
    2004-09-04 C0091 0 4940 16768 45060 50000
    2004-09-06 C0091 0 -6300 3640 56300 50000
      

  9.   

    execute KeHuXSJDTJ86 '2004-01-01','2004-10--10'  --? 这个是日期型吗?
      

  10.   

    写错了,应该是:execute KeHuXSJDTJ86 '2004-01-01','2004-10-10'
    是日期,但是是字符串格式.
      

  11.   

    --测试数据
    create table tb_nKeHuXSJDB(F_cRiQi datetime,F_cKeHuBM varchar(10)
    ,F_nBenRiYSHK decimal(10,1),F_nShengYuHK decimal(10,1),F_nBenRiFHJE decimal(10,1),F_nLeiJiFHJE decimal(10,1),F_nLeiJiYSJE decimal(10,1))
    insert tb_nKeHuXSJDB select '2004-07-12','C0169','0','90860','29140','29140','120000'
    union all select '2004-06-22','C0169','120000','120000','0','0','120000'
    union all select '2004-07-05','C0170','50000','50000','0','0','50000'
    union all select '2004-07-02','C0171','20000','20000','0','0','20000'
    union all select '2004-08-11','C0148','0','140904','9096','9096','150000'
    union all select '2004-07-27','C0169','0','-108640','199500','228640','120000'
    union all select '2004-08-07','C0174','0','-10296','10296','10296','0'
    union all select '2004-08-09','C0175','0','-4117.5','4117.5','4117.5','0'
    union all select '2003-08-09','C0175','0','0','0','0','0'
    union all select '2004-08-17','C0174','0','-84861.6','0','84861.6','0'
    union all select '2004-08-14','C0174','0','-84861.6','74565.6','84861.6','0'
    union all select '2004-08-12','C0176','0','-7680','7680','7680','0'
    union all select '2004-08-16','C0176','0','-10880','3200','10880','0'
    union all select '2004-08-13','C0177','60600','60600','0','0','60600'
    union all select '2004-08-19','C0169','100000','-168349.6','159709.6','388349.6','220000'
    union all select '2004-08-27','C0169','0','-168349.6','0','388349.6','220000'
    union all select '2004-08-18','C0172','0','33004.8','23755.2','23755.2','56760'
    union all select '2004-08-18','C0181','0','-385.8','385.8','385.8','0'
    union all select '2004-08-23','C0173','0','-49280','69280','69280','20000'
    union all select '2004-08-23','C0148','0','-42171.2','183075.2','192171.2','150000'
    union all select '2004-08-28','C0197','0','-14160','14160','14160','0'
    union all select '2004-08-26','C0182','0','-22742.8','13541.24','22742.8','0'
    union all select '2004-08-31','C0207','0','17607.2','392.8','392.8','18000'
    union all select '2004-08-27','C0181','0','-114518.6','114132.8','114518.6','0'
    union all select '2004-08-29','C0151','0','-1335.8','1335.8','1335.8','0'
    union all select '2004-08-28','C0149','0','-34680','34680','34680','0'
    union all select '2004-08-29','C0149','0','-47980','13300','47980','0'
    union all select '2004-08-31','C0209','0','-3094.56','3094.56','3094.56','0'
    union all select '2004-08-23','C0176','0','-12160','1280','12160','0'
    union all select '2004-08-30','C0211','0','0','0','0','0'
    union all select '2004-08-30','C0215','66000','66000','0','0','66000'
    union all select '2004-08-30','C0207','18000','18000','0','0','18000'
    union all select '2004-08-31','C0091','50000','33480','11420','16520','50000'
    union all select '2004-08-31','C0172','0','-83770.54','116775.34','140530.54','56760'
    union all select '2004-09-01','C0091','0','32100','1380','17900','50000'
    union all select '2004-09-01','C0153','0','-2560','2560','2560','0'
    union all select '2004-09-03','C0091','0','21708','10392','28292','50000'
    union all select '2004-09-05','C0091','0','-2660','7600','52660','50000'
    union all select '2004-07-15','C0172','56760','56760','0','0','56760'
    union all select '2004-07-23','C0148','150000','150000','0','0','150000'
    union all select '2004-07-27','C0173','20000','20000','0','0','20000'
    union all select '2004-08-18','C0177','0','41017.62','19582.38','19582.38','60600'
    union all select '2004-08-20','C0182','0','-9201.56','9201.56','9201.56','0'
    union all select '2005-08-20','C0182','0','-22742.8','0','22742.8','0'
    union all select '2004-08-20','C0175','30000','25882.5','0','4117.5','30000'
    union all select '2004-09-03','C0207','0','17607.2','0','392.8','18000'
    union all select '2004-08-30','C0091','0','-5100','5100','5100','0'
    union all select '2004-08-31','C0170','0','-7000','57000','57000','50000'
    union all select '2004-09-04','C0153','0','-11940','9380','11940','0'
    union all select '2004-09-04','C0091','0','4940','16768','45060','50000'
    union all select '2004-09-06','C0091','0','-6300','3640','56300','50000'
    go--处理过程
    CREATE PROCEDURE dbo.KeHuXSJDTJ86 
    @strdate1 varchar(20),
    @strDate2 varchar(20) 
    AS
    declare @sqlhead nvarchar(4000),@sqlend nvarchar(4000)
    ,@sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
    ,@i int,@ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0
    ,a=',['+rtrim(F_cKeHuBM)+'||本日发货]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nBenRiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||发货累计]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nLeiJiFHJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||本日预收]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nBenRiYSHK else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||预收累计]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nLeiJiYSJE else 0 end)'
    +',['+rtrim(F_cKeHuBM)+'||剩余货款]=sum(case F_cKeHuBM when '''+F_cKeHuBM+''' then F_nShengYuHK  else 0 end)'
    into # from(select distinct F_cKeHuBM from tb_nKeHuXSJDB) a--判断需要多少个变量来处理
    select @i=max(len(a)) from #
    set @i=3800/@i--分组临时表
    update # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''select F_cRiQi as 日期'''
    ,@sqlend=''' from tb_nKeHuXSJDB where F_cRiQi >= '''''+@strdate1+'''''  and F_cRiQi <= '''''+@strDate2+''''' group by F_cRiQi'''
    ,@sql1='',@sql2='',@sql3='',@sql4=''while @i>=0
    select @ic=cast(@i as varchar),@i=@i-1
    ,@sql1=',@'+@ic+' nvarchar(4000)'+@sql1
    ,@sql2=',@'+@ic+'='''''+@sql2
    ,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
    +char(13)+@sql3
    ,@sql4='+@'+@ic+@sql4select @sql1=stuff(@sql1,1,1,'')
    ,@sql2=stuff(@sql2,1,1,'')
    ,@sql3=left(@sql3,len(@sql3)-1)
    ,@sql4=stuff(@sql4,1,1,'')--执行
    exec('
    declare '+@sql1+'
    select '+@sql2+'
    '+@sql3+'
    exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
    )
    GO
    --调用
    execute KeHuXSJDTJ86 '2004-01-01','2004-10-10'
    go--删除测试
    drop proc KeHuXSJDTJ86
    drop table tb_nKeHuXSJDB/*--测试结果--*/