ALTER PROCEDURE [dbo].[Proc_Test]
(
@Time datetime,
@SUMValue decimal output
)
AS

BEGIN
SET NOCOUNT ON;
    DECLARE @ReturnValue decimal
DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
DECLARE @T_T decimal
    OPEN MyCursor
FETCH NEXT FROM MyCursor into @T_T
WHILE @@FETCH_STATUS = 0
   BEGIN
  set @ReturnValue =+round(N'12'*isnull(@T_T,0),0)

      FETCH NEXT FROM MyCursor;
   ENDCLOSE MyCursor
DEALLOCATE MyCursor
END以上为存储过程:请问这个能实现 set @ReturnValue =+round(N'12'*isnull(@T_T,0),0)
的累加吗?我最后要返回@ReturnValue 的数值。

解决方案 »

  1.   

    在定义游标前给@ReturnValue赋0
    循环内
    set @ReturnValue =@ReturnValue+round(N'12'*isnull(@T_T,0),0)
      

  2.   

    看你的意思不是求sum(YUEZONGJ)*12吗?
      

  3.   

    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal output
    )
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @ReturnValue decimal
        select @ReturnValue = sum(round(12*isnull(YUEZONGJ,0))) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    END
      

  4.   

    因为是四舍五入的问题。所以:必须先乘后加。我按你的这个改了后。 怎么@ReturnValue还是 0啊。
      

  5.   

    抱歉,更正一下:
    ALTER PROCEDURE [dbo].[Proc_Test](@Time datetime,@SUMValue decimal output)
    AS
    BEGIN
        SET NOCOUNT ON
        select @SUMValue = sum(round(12*isnull(YUEZONGJ,0))) 
        from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    END
      

  6.   

    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal(10,2) output
    )
    ASBEGIN
    SET NOCOUNT ON;
    DECLARE @ReturnValue decimal(10,2)
    set @ReturnValue=0
    DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    DECLARE @T_T decimal(10,2)
    OPEN MyCursor
    FETCH NEXT FROM MyCursor into @T_T
    WHILE @@FETCH_STATUS = 0
    BEGIN
    set @ReturnValue =@ReturnValue+round(N'12'*isnull(@T_T,0),0)FETCH NEXT FROM MyCursor into @T_T
    ENDCLOSE MyCursor
    DEALLOCATE MyCursor
    END
      

  7.   

    楼上的:chuifengde(树上的鸟儿) 我按你的代码调试了。还是0。谢谢帮助
      

  8.   

    hellowork(一两清风) :你这个 select @SUMValue = sum(round(12*isnull(YUEZONGJ,0))) 
        from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    数据库是怎么来执行的了?是取出一行*12。然后把所有的都加吗?数据库怎么做到这点的啊。
      

  9.   

    1.是取出一行*12。然后把所有的都加吗?
    ----------------------------------------------
    是的.2.数据库怎么做到这点的啊。
    ----------------------------------------------
    sum()是聚合函数,即逐行累加.
      

  10.   

    恩。谢谢。那你看看我那个用游标的怎么就返回都数值老为0了。
    代码如下:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal(10,2) output
    )
    AS

    BEGIN
    SET NOCOUNT ON;
        DECLARE @ReturnValue decimal(10,2)
    set @ReturnValue=0.00
    DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    DECLARE @T_T decimal
        OPEN MyCursor
    FETCH NEXT FROM MyCursor into @T_T
    WHILE @@FETCH_STATUS = 0
       BEGIN
      set @ReturnValue =@ReturnValue+round(N'12'*isnull(@T_T,0),0)
          FETCH NEXT FROM MyCursor;
       ENDCLOSE MyCursor
    DEALLOCATE MyCursor
    END
      

  11.   

    ......
    CLOSE MyCursor
    DEALLOCATE MyCursor
    set @SUMValue = @ReturnValue  /*将累加的值赋予输出型参数*/
    END
      

  12.   

    set @SUMValue = @ReturnValue  有。也不行。
      

  13.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal(10,2) output
    )
    AS

    BEGIN
    SET NOCOUNT ON;
        DECLARE @ReturnValue1 decimal(10,2)
    set @ReturnValue1=0.00
    DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    DECLARE @T_T decimal
        OPEN MyCursor
    FETCH NEXT FROM MyCursor into @T_T
    WHILE @@FETCH_STATUS = 0
       BEGIN
      set @ReturnValue1 =@ReturnValue1+round(N'12'*isnull(@T_T,0),0)
          FETCH NEXT FROM MyCursor;
       ENDCLOSE MyCursor
    DEALLOCATE MyCursor
    --select @SUMValue = sum(round(12*isnull(YUEZONGJ,0),0)) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time--select @SUMValue = round(12*sum(isnull(YUEZONGJ,0)),0) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    set @SUMValue = @ReturnValue1  END
      

  14.   

    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal(10,2) output
    )
    AS

    BEGIN
    SET NOCOUNT ON;
        DECLARE @ReturnValue decimal(10,2)
    set @ReturnValue=0.00
    DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    DECLARE @T_T decimal
        OPEN MyCursor
    FETCH NEXT FROM MyCursor into @T_T
    WHILE @@FETCH_STATUS = 0
       BEGIN
      set @ReturnValue =@ReturnValue+round(N'12'*isnull(@T_T,0),0)
               FETCH NEXT FROM MyCursor into @T_T  /*加上into @T_T*/
       ENDCLOSE MyCursor
    DEALLOCATE MyCursor
    set @SUMValue = @ReturnValue  /*将累加的值赋予输出型参数*/
    END
      

  15.   

    恩:真是高手。谢谢啊。呵呵。
    我现在这里有三个思路:
    1。set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER PROCEDURE [dbo].[Proc_Test]
    (
    @Time datetime,
    @SUMValue decimal(10,2) output
    )
    AS

    BEGIN
    SET NOCOUNT ON;
        DECLARE @ReturnValue1 decimal(10,2)
    set @ReturnValue1=0.00
    DECLARE MyCursor CURSOR FOR SELECT YUEZONGJ FROM v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    DECLARE @T_T decimal
        OPEN MyCursor
    FETCH NEXT FROM MyCursor into @T_T
    WHILE @@FETCH_STATUS = 0
       BEGIN
      set @ReturnValue1 =@ReturnValue1+round(N'12'*isnull(@T_T,0),0)
          FETCH NEXT FROM MyCursor into @T_T;
       ENDCLOSE MyCursor
    DEALLOCATE MyCursor
    2。--select @SUMValue = sum(round(12*isnull(YUEZONGJ,0),0)) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time3。--select @SUMValue = round(12*sum(isnull(YUEZONGJ,0)),0) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    set @SUMValue = @ReturnValue1  END最后:调试结果为:15319740,15319759,15319757为什么会这样了。 应该是。1和2思路的结果一样才对啊。
    非常谢谢。
      

  16.   

    YUEZONGJ列的小数位数可能超过2位,在游标中循环时将该列的值提取到@T_T中时会截断第2位后面的小数,如果行数多则截断的小数累加起来值也会不小.

    select @SUMValue = round(12*sum(isnull(YUEZONGJ,0)),0) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time
    这种累加方式完全没有截断YUEZONGJ列的值,保持了原有的精度,这个是最准确的.
    如果希望游标以上二种方式计算的值最接近,有二种办法:
    方法1:
    将@T_T声明为float类型,即declare @T_T float
    方法2:将YUEZONGJ转换为DECIMAL(10,2)类型
    select @SUMValue = round(12*sum(isnull(CAST(YUEZONGJ AS DECIMAL(10,2)),0)),0) from v_Syn_BIZ_MSP_LISTMS Where MEASDATE < @Time