CREATE PROCEDURE [compute] 
@sum1 numeric(10,2) output
AS
declare @a varchar(100),@i int,@b varchar(100),@sql varchar(1000),@sum real
set @sum=0
set @i=day(getdate())
while @i>6
 begin

set @a='d'+convert(char(8),getdate()-@i,112) --得到时间表名
set @b=convert(char(8),getdate()-@i,112)
set @sql='select sum(首站总供水流量) from '+@a+' where 采集时间='+@b+'0800 or 采集时间='+@b+'1200 or 采集时间           ='+@b+'2400' --动态得到表
exec sp_executesql @sql,N'@sum int output',@sum output
  set @sum1=@sum1+@sum
set @i=@i-1
 end
GO-----------------
declare @a numeric(10,2)
exec compute @a output
select @a

解决方案 »

  1.   

    CREATE PROCEDURE [compute] 
    @sum1 real output
    AS
    declare @a varchar(100),@i int,@b varchar(100),@sql varchar(1000),@sum real
    set @sum=0
    set @i=day(getdate())
    while @i>6
     begin

    set @a='d'+convert(char(8),getdate()-@i,112) --得到时间表名
    set @b=convert(char(8),getdate()-@i,112)
    set @sql='select @sum=sum(首站总供水流量) from '+@a+' where 采集时间='+@b+'0800 or 采集时间='+@b+'1200 or 采集时间   ='+@b+'2400' --动态得到表
    exec sp_executesql @sql,N'@sum int output',@sum output
      set @sum1=@sum1+@sum
    set @i=@i-1
     end
    return(@sum1)
      

  2.   

    还是有错:
    服务器: 消息 214,级别 16,状态 2,过程 sp_executesql,行 13
    过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
      

  3.   

    CREATE PROCEDURE [compute] 
    @sum1 real output
    AS
    declare @a varchar(100),@i int,@b varchar(100)
    ,@sql nvarchar(4000)  --这里要定义为nvarchar类型
    ,@sum real
    set @sum=0
    set @i=day(getdate())
    while @i>6
     begin

    set @a='d'+convert(char(8),getdate()-@i,112) --得到时间表名
    set @b=convert(char(8),getdate()-@i,112)
    set @sql='select @sum=sum(首站总供水流量) from '+@a+' where 采集时间='+@b+'0800 or 采集时间='+@b+'1200 or 采集时间   ='+@b+'2400' --动态得到表
    exec sp_executesql @sql,N'@sum int output',@sum output
      set @sum1=isnull(@sum1,0)+@sum  --不知道你是如何调用的,如果@sum1无初始值的话,得不到正确结果.所以要判断一下,@sum1是否为null,因为null与任何值的计算结果均为null.
    set @i=@i-1
     end
    --return(@sum1)  ---其实可以不要这句
    go--调用 
    declare @re real
    exec compute @re out
    select 结果=@re
      

  4.   

    CREATE PROCEDURE [compute] 
    @sum1 real output
    AS
    declare @a varchar(100),@i int,@b varchar(100),@sql nvarchar(4000),@sum real
    set @sum=0
    set @i=day(getdate())
    while @i>6
     begin

    set @a='d'+convert(char(8),getdate()-@i,112) --得到时间表名
    set @b=convert(char(8),getdate()-@i,112)
    set @sql=N'select @sum=sum(首站总供水流量) from '+@a+' where 采集时间='+@b+'0800 or 采集时间='+@b+'1200 or 采集时间   ='+@b+'2400' --动态得到表
    exec sp_executesql @sql,N'@sum int output',@sum output
      set @sum1=@sum1+@sum
    set @i=@i-1
     end
    return(@sum1)
      

  5.   

    传出一个output参数可以,如果改成两个参数:
    CREATE PROCEDURE [compute] 
    @sum1 real output,@sum3 real output
    AS
    declare @a varchar(100),@i int,@b varchar(100)
    ,@sql nvarchar(4000)  --这里要定义为nvarchar类型
    ,@sum real
    ,@sum2 real
    set @sum=0
    set @sum1=0
    set @sum2=0
    set @sum3=0
    set @i=day(getdate())
    while @i>0
    begin
    set @a='d'+convert(char(8),getdate()-@i+1,112) --得到时间表名
    set @b=convert(char(8),getdate()-@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
    set @sql='select @sum=sum(首站总供水流量),@sum2=sum(首站总供压) from '+@a+' where 采集时间='+@b+'0800 or 采集时间='+@b+'1600 or 采集时间   ='+@b+'2400' --动态得到表
    exec sp_executesql @sql,N'@sum int output',@sum output
      set @sum1=isnull(@sum,0)+@sum1  --不知道你是如何调用的,如果@sum1无初始值的话,得不到正确结果.所以要判断一下,@sum1是否为null,因为null与任何值的计算结果均为null.
    set @sum1=isnull(@sum2,0)+@sum3
    set @i=@i-1
    end
                 else
    set @i=@i-1
     end
    GO---------
    declare @re real,@re1 real
    exec [compute] @re out,@re1 out
    select 结果=@re,ee=@re1就出现:
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@sum2'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@sum2'。
    为什么?