通过SQL游标更新和计算值

通过SQL游标更新和计算值,sql,sql-server,sql-update,cursor,Sql,Sql Server,Sql Update,Cursor,我有两列(TSD\U BALANCEUNITS和TSD\U UNITSINCERT)TSD\U平衡单位有数值,TSD\U单位SINCERT有0.00 通过使用游标,我想将TSD\U平衡单位的值更新到TSD\U单位SINCERT,直到从TSD\U平衡单位更新到TSD\U单位SINCERT的值总和等于199.00 当移动值的总和等于199.00 下面是我正在使用的脚本 DECLARE @cnt INT = 0; DECLARE @TSD_BALANCEUNITS AS

我有两列(TSD\U BALANCEUNITS和TSD\U UNITSINCERTTSD\U平衡单位有数值,TSD\U单位SINCERT有0.00

通过使用游标,我想将TSD\U平衡单位的值更新到TSD\U单位SINCERT,直到从TSD\U平衡单位更新到TSD\U单位SINCERT的值总和等于199.00

当移动值的总和等于199.00

下面是我正在使用的脚本

        DECLARE @cnt INT = 0;
        DECLARE @TSD_BALANCEUNITS AS DECIMAL(25, 4)
        DECLARE @TSD_UNITSINCERT AS DECIMAL(25, 4)
        DECLARE @CHECKFLAG AS DECIMAL(25, 4)
        DECLARE LOCK_CERT_UNITS CURSOR LOCAL STATIC
        FOR

        SELECT TSD_BALANCEUNITS
            ,TSD_UNITSINCERT
        FROM IS_TRX_TRX_PROCESSED
        WHERE (TSD_ACCCODE = 8775)
            AND TSD_BALANCEUNITS > 0
        ORDER BY TSD_REALIZEDDATE ASC


        OPEN LOCK_CERT_UNITS

        FETCH NEXT
        FROM LOCK_CERT_UNITS
        INTO @TSD_BALANCEUNITS
            ,@TSD_UNITSINCERT

        WHILE @@FETCH_STATUS = 0 --AND @cnt < 199.00
        BEGIN
            SET @TSD_UNITSINCERT = @TSD_BALANCEUNITS
            SET @CHECKFLAG = + @TSD_BALANCEUNITS

            IF (SUM(@CHECKFLAG) <= 199.00)
            BEGIN
                UPDATE IS_TRX_TRX_PROCESSED
                SET TSD_UNITSINCERT = TSD_BALANCEUNITS
                WHERE (TSD_ACCCODE = 8775)
                    AND TSD_BALANCEUNITS > 0
            END

            PRINT 'BALANCE UNIT =' + CONVERT(VARCHAR(50), @TSD_BALANCEUNITS) + ' ==> ' + 'CERT IN UNITS =' + CONVERT(VARCHAR(50), @TSD_UNITSINCERT);

            FETCH NEXT
            FROM LOCK_CERT_UNITS
            INTO @TSD_BALANCEUNITS
                ,@TSD_UNITSINCERT
        END

        CLOSE LOCK_CERT_UNITS

        DEALLOCATE LOCK_CERT_UNITS
        GO
DECLARE@cnt INT=0;
将@TSD_余额单位声明为十进制(25,4)
将@TSD_UNITSINCERT声明为十进制(25,4)
将@CHECKFLAG声明为十进制(25,4)
声明锁定证书单位游标本地静态
对于
选择TSD\U平衡单位
,TSD_单位证书
是否已从中处理\u TRX\u TRX\u
其中(TSD_ACCCODE=8775)
和TSD_平衡单位>0
TSD_实现的订单日期ASC
打开锁定证书单元
接下一个
来自锁定证书单元
进入@TSD\U平衡单元
,@TSD_UNITSINCERT
而@@FETCH_STATUS=0--@cnt<199.00
开始
设置@TSD\U单位证书=@TSD\U平衡单位
设置@CHECKFLAG=+@TSD\u平衡单位
如果(总和(@CHECKFLAG)为0
结束
打印“余额单位=”+转换(VARCHAR(50),@TSD_BALANCEUNITS)+“=>”+“单位证书=”+转换(VARCHAR(50),@TSD_UNITSINCERT);
接下一个
来自锁定证书单元
进入@TSD\U平衡单元
,@TSD_UNITSINCERT
结束
关闭锁定证书单元
解除分配锁定证书单元
去

此命令:

UPDATE IS_TRX_TRX_PROCESSED
SET    TSD_UNITSINCERT = TSD_BALANCEUNITS
WHERE  (TSD_ACCCODE = 8775)
AND    TSD_BALANCEUNITS > 0
更新TSD_ACCCODE=8775且TSD_BALANCEUNITS>0的所有记录,其总和是否为999无关紧要,您需要以某种方式确定哪些记录必须更新


第二,根据结果,这种情况从未发生过。这意味着
如果(SUM(@CHECKFLAG))您可以将输入数据放入sql查询中工作吗?如果您没有添加表结构,请添加所有相关信息,以便一些人可以查看问题。两列都是十进制(24,8)请阅读,脚本正在将记录从一列更新到另一列,但当更新的总数等于199.00时,我无法找到停止它的方法。是的,问题在于
@CHECKFLAG
。在where子句中进行了一些更改后,脚本得到了进一步完善…但问题在于标志。因为标志不是初始的已初始化为0。因此无法正确获取值。
SET @CHECKFLAG = 0;