--exec yanqipaifang '2009','1',0
CREATE   PROCEDURE yanqipaifang@Y varchar(4),--指定年
@M varchar(2), --指定月
@flag int ,--查询方式 1 指定年,0指定月
@caijishijian varchar
AS
--定义存储过程内部变量
declare
@a varchar(100),
@tmp varchar(100),
@j int,
@i int,
@b varchar(100)
,@sql nvarchar(4000)  --这里要定义为nvarchar类型
,@东桥原煤量1 real
,@老厂石灰石量1 real
,@新厂石灰石量1 real
,@东桥原煤量累计1 real
,@老厂石灰石量累计1 real
,@新厂石灰石量累计1 real
,@老厂脱硫电量消耗1 real
,@新厂脱硫电量消耗1 real
,@新厂煤量采集1 real
,@新厂煤量累计1 real
,@riqi datetime  
,@东桥原煤量 real
,@老厂石灰石量 real
,@新厂石灰石量 real
,@东桥原煤量累计 real
,@老厂石灰石量累计 real
,@新厂石灰石量累计 real
,@老厂脱硫电量消耗 real
,@新厂脱硫电量消耗 real
,@新厂煤量采集 real
,@新厂煤量累计 real
--给定义的变量赋初值0
set @东桥原煤量=0
set @老厂石灰石量=0
set @新厂石灰石量=0
set @东桥原煤量累计=0
set @老厂石灰石量累计=0
set @新厂石灰石量累计=0
set @老厂脱硫电量消耗=0
set @新厂脱硫电量消耗=0
set @新厂煤量采集=0
set @新厂煤量累计=0
--给定义的内部变量赋初值0
set @东桥原煤量1=0
set @老厂石灰石量1=0
set @新厂石灰石量1=0
set @东桥原煤量累计1=0
set @老厂石灰石量累计1=0
set @新厂石灰石量累计1=0
set @老厂脱硫电量消耗1=0
set @新厂脱硫电量消耗1=0
set @新厂煤量采集1=0
set @新厂煤量累计1=0
if @flag=1 
begin
  set @j=12
  while @j>0
  begin
    select @tmp =@Y+'-'+(str(@j))+'-01'
    --print @riqi     
    select @riqi=dateadd(dd,-day(@tmp),dateadd(m,1,@tmp))    set @i=day(@riqi)  --循环取出需要的各值的和
    while @i>0
    begin
     set @a='a'+convert(char(8),@riqi-@i+1,112) --得到时间表名
        -- print @a
     set @b=convert(char(8),@riqi-@i+1,112)
     if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].['+@a+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1 )
    begin
     --print @a
                               --查询数据库中的参数,内部变量=sum(字段名)
     set @sql='select @东桥原煤量1=sum(东桥原煤量),@老厂石灰石量1=sum(老厂石灰石量),@新厂石灰石量1=sum(新厂石灰石量),@东桥原煤量累计1=sum(东桥原煤量累计),@老厂石灰石量累计1=sum(老厂石灰石量累计),@新厂石灰石量累计1=sum(新厂石灰石量累计),@老厂脱硫电量消耗1=sum(老厂脱硫电量消耗),@新厂脱硫电量消耗1=sum(新厂脱硫电量消耗),@新厂煤量采集1=sum(新厂煤量采集),@新厂煤量累计1=sum(新厂煤量累计) from '+@a+' where 采集时间=(select max(采集时间) from '+@a+')' --动态得到表
      --print @sql
                exec sp_executesql @sql,N'@东桥原煤量1 real output,@老厂石灰石量1 real output,@新厂石灰石量1 real output,@东桥原煤量累计1 real output ,@老厂石灰石量累计1 real output,@新厂石灰石量累计1 real output,@老厂脱硫电量消耗1 real output,@新厂脱硫电量消耗1 real  output,@新厂煤量采集1 real  output,@新厂煤量累计1 real  output',
        @东桥原煤量1 output,@老厂石灰石量1 output,@新厂石灰石量1 output,@东桥原煤量累计1  output ,@老厂石灰石量累计1 output,@新厂石灰石量累计1 output,@老厂脱硫电量消耗1 output,@新厂脱硫电量消耗1  output,@新厂煤量采集1  output,@新厂煤量累计1  output    --输出内部变量-
        set @东桥原煤量=isnull(@东桥原煤量1,0)+@东桥原煤量  --如果@sum1无初始值的话,得不到正确结果.所以要判断一下,@sum1是否为null,因为null与任何值的计算结果均为null.
        set @老厂石灰石量=isnull(@老厂石灰石量1,0)+@老厂石灰石量  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @新厂石灰石量=isnull(@新厂石灰石量1,0)+@新厂石灰石量
        set @东桥原煤量累计=isnull(@东桥原煤量累计1,0)+@东桥原煤量累计  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @老厂石灰石量累计=isnull(@老厂石灰石量累计1,0)+@老厂石灰石量累计
        set @新厂石灰石量累计=isnull(@新厂石灰石量累计1,0)+@新厂石灰石量累计  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @老厂脱硫电量消耗=isnull(@老厂脱硫电量消耗1,0)+@老厂脱硫电量消耗
        set @新厂脱硫电量消耗=isnull(@新厂脱硫电量消耗1,0)+@新厂脱硫电量消耗  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @新厂煤量采集=isnull(@新厂煤量采集1,0)+@新厂煤量采集
        set @新厂煤量累计=isnull(@新厂煤量累计1,0)+@新厂煤量累计  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @i=@i-1
    end
          else
                          set @i=@i-1 
    end    insert into newajk values(@东桥原煤量,@老厂石灰石量,@新厂石灰石量,@东桥原煤量累计,@老厂石灰石量累计,@新厂石灰石量累计,@老厂脱硫电量消耗,@新厂脱硫电量消耗,@新厂煤量采集,@新厂煤量累计,@caijishijian)
  --  print @j
    set @j=@j-1
    end
   insert into newajk select sum(东桥原煤量),sum(老厂石灰石量),sum(新厂石灰石量),sum(东桥原煤量累计),sum(老厂石灰石量累计),sum(新厂石灰石量累计),sum(老厂脱硫电量消耗),sum(新厂脱硫电量消耗),sum(新厂煤量采集),sum(新厂煤量累计),@caijishijian from  #tmp
end
else
begin
    select @tmp =@Y+'-'+(str(@M))+'-01'
    --print @riqi     
    select @riqi=dateadd(dd,-day(@tmp),dateadd(m,1,@tmp))
--print @riqi
  set @i=day(@riqi)  --循环取出需要的各值的和
--exec shihuishi1 '2009','1',1
  while @i>0
  begin
--print @i   set @a='a'+convert(char(8),@riqi-@i+1,112) --得到时间表名
   set @b=convert(char(8),@riqi-@i+1,112)
--print day(@b)
   if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].['+@a+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
   begin
   --print @a
                             --查询数据库中的参数,内部变量=sum(字段名)
   set @sql='select  @东桥原煤量1=sum(东桥原煤量),@老厂石灰石量1=sum(老厂石灰石量),@新厂石灰石量1=sum(新厂石灰石量),@东桥原煤量累计1=sum(东桥原煤量累计),@老厂石灰石量累计1=sum(老厂石灰石量累计),@新厂石灰石量累计1=sum(新厂石灰石量累计),@老厂脱硫电量消耗1=sum(老厂脱硫电量消耗),@新厂脱硫电量消耗1=sum(新厂脱硫电量消耗),@新厂煤量采集1=sum(新厂煤量采集),@新厂煤量累计1=sum(新厂煤量累计) from '+@a+' where 采集时间=(select max(采集时间) from '+@a+')'  --动态得到表
   --print @sql
        exec sp_executesql @sql,N'@东桥原煤量1 real output,@老厂石灰石量1 real output,@新厂石灰石量1 real output,@东桥原煤量累计1 real output ,@老厂石灰石量累计1 real output,@新厂石灰石量累计1 real output,@老厂脱硫电量消耗1 real output,@新厂脱硫电量消耗1 real  output,@新厂煤量采集1 real  output,@新厂煤量累计1 real  output',
   --        @东桥原煤量1 output,@老厂石灰石量1 output,@新厂石灰石量1 output,@东桥原煤量累计1 output,@老厂石灰石量累计1 output     --输出内部变
      @东桥原煤量1 output,@老厂石灰石量1 output,@新厂石灰石量1 output,@东桥原煤量累计1  output ,@老厂石灰石量累计1 output,@新厂石灰石量累计1 output,@老厂脱硫电量消耗1 output,@新厂脱硫电量消耗1  output,@新厂煤量采集1  output,@新厂煤量累计1  output    --输出内部变量-
 
        set @东桥原煤量=isnull(@东桥原煤量1,0)+@东桥原煤量  --如果@sum1无初始值的话,得不到正确结果.所以要判断一下,@sum1是否为null,因为null与任何值的计算结果均为null.
        set @老厂石灰石量=isnull(@老厂石灰石量1,0)+@老厂石灰石量  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @新厂石灰石量=isnull(@新厂石灰石量1,0)+@新厂石灰石量
        set @老厂石灰石量累计=isnull(@老厂石灰石量累计1,0)+@老厂石灰石量累计
        set @东桥原煤量累计=isnull(@东桥原煤量累计1,0)+@东桥原煤量累计        set @新厂煤量累计=isnull(@新厂煤量累计1,0)+@新厂煤量累计  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @老厂脱硫电量消耗=isnull(@老厂脱硫电量消耗1,0)+@老厂脱硫电量消耗
        set @新厂脱硫电量消耗=isnull(@新厂脱硫电量消耗1,0)+@新厂脱硫电量消耗  --输出参数=isnull(@对应的内部变量,0)+@输出参数
        set @新厂煤量采集=isnull(@新厂煤量采集1,0)+@新厂煤量采集
        set @新厂煤量累计=isnull(@新厂煤量累计1,0)+@新厂煤量累计  --输出参数=isnull(@对应的内部变量,0)+@输出参数
           
      insert into newajk values(@东桥原煤量1,@老厂石灰石量1,@新厂石灰石量1,@东桥原煤量累计1,@老厂石灰石量累计1,@新厂石灰石量累计1,@老厂脱硫电量消耗1,@新厂脱硫电量消耗1,@新厂煤量采集1,@新厂煤量累计1,@caijishijian)
      set @i=@i-1
   end
    else
     set @i=@i-1
  end
insert into newajk values(0,@老厂石灰石量,0,@东桥原煤量累计,0,@新厂煤量累计,0,0,0,@新厂煤量累计,@caijishijian)
begin
select @i=count(*)-1 from newajk
end
end
GO我这个存储过程 需要改写成 自动插入到表中 但是不能有时间重复,采集时间字段显示 当前年月 每天执行一次这个存储过程,然后有重复数据就update 不知道怎么改 谢谢大家帮忙看看
表结构是:
create table newajk(东桥原煤量 real,老厂石灰石量 real,新厂石灰石量 real,东桥原煤量累计 real,老厂石灰石量累计 real, 新厂石灰石量累计 real, 老厂脱硫电量消耗 real,新厂脱硫电量消耗 real,新厂煤量采集 real,新厂煤量累计 real,采集时间 caijishijian varchar) 

解决方案 »

  1.   


    --采集时间获取当前时间可以set @caijishijian = convert(varchar(19),getdate(),120)
      

  2.   

    在表里 caijishijian 是一个时间字段 请问怎么改呢 谢谢了 帮忙看看吧 急求!!
      

  3.   


    @Y  --指定年的
    @M  --指定月的--可以按当前的时间获取set @caijishijian = @Y+'-'+@M+'-'+datepart(dd,getdate())+' '
                                     +datepart(hh,getdate())+':'
                                     +datepart(mi,getdate())+':'
                                     +datepart(ss,getdate())
      

  4.   


    CREATE   PROCEDURE yanqipaifang@Y varchar(4),--指定年
    @M varchar(2), --指定月
    @flag int ,--查询方式 1 指定年,0指定月
    @caijishijian varchar   --指定宽度  varchar(20)
    AS
      

  5.   

    不是这个意思啊 我实际的表是每天一个表 这些表字段都是一样的,我要完成多这些字段的月累计计算。然后存到一个表里,这些表有时间字段叫 ‘采集时间’ 月累计这个表里也有这个字段 只要显示年月日就可以了
    然后其他字段都是这个月的表里数据的月累计 还有就是 这个月累计的存储过程我想每天执行一次,这里面就存在一个 update的问题 而不能没执行一次就插入一次 那样就乱了!!请大家帮忙修改一下!!谢谢了!