通过SQL游标更新和计算值
我有两列(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 下面是我正在使用的脚本通过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
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;