通过SQL Cursor更新计算值
Update and calculate value through SQL Cursor
我有两列(TSD_BALANCEUNITS 和 TSD_UNITSINCERT)。 TSD_BALANCEUNITS 有数值,TSD_UNITSINCERT 有 0.00
通过使用游标,我想将 TSD_BALANCEUNITS 的值更新为 TSD_UNITSINCERT 直到总和从 TSD_BALANCEUNITS 更新到 TSD_UNITSINCERT 的值等于 199.00
和正在更新的TSD_BALANCEUNITS的值变为0.00并移动到TSD_UNITSINCERT时总计移动值的总和等于 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
这个命令:
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 并不重要,您需要以某种方式确定哪些记录必须更新。
其次,根据结果,这永远不会发生。这意味着 IF (SUM(@CHECKFLAG) <= 199.00)
永远不会为真。我想是因为您从未将其值初始化为 0。
SET @CHECKFLAG = 0;
我有两列(TSD_BALANCEUNITS 和 TSD_UNITSINCERT)。 TSD_BALANCEUNITS 有数值,TSD_UNITSINCERT 有 0.00
通过使用游标,我想将 TSD_BALANCEUNITS 的值更新为 TSD_UNITSINCERT 直到总和从 TSD_BALANCEUNITS 更新到 TSD_UNITSINCERT 的值等于 199.00
和正在更新的TSD_BALANCEUNITS的值变为0.00并移动到TSD_UNITSINCERT时总计移动值的总和等于 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
这个命令:
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 并不重要,您需要以某种方式确定哪些记录必须更新。
其次,根据结果,这永远不会发生。这意味着 IF (SUM(@CHECKFLAG) <= 199.00)
永远不会为真。我想是因为您从未将其值初始化为 0。
SET @CHECKFLAG = 0;