SQL Server循环记录

Tar*_*ryn 1 sql ms-access vba loops sql-server-2005

我一直在线寻找重写当前VBA/MS Access Sub以在SQL Server 2005中的存储过程中工作的最佳方法.我们不应该使用CURSORS项目,除非我们能够完全解释为什么我们不能这样做的原因另一种方式.

现行代码:

Public Sub updcsh()

Dim tranamt
Dim Acct
Dim acct2
Dim Csh
Dim recSet As Recordset

    DAO.DBEngine.SetOption dbMaxLocksPerFile, 100000

    Set recSet = CurrentDb.OpenRecordset("FndVios")
    recSet.MoveFirst


    Do Until recSet.EOF
        Acct = recSet![ID]
        tranamt = recSet![TAM]

        If Acct <> acct2 Then
            Csh = recSet![Due]
        End If

        Csh = Csh+ tranamt
        acct2 = Acct

        recSet.Edit
            recSet![Due] = Csh
        recSet.Update

        recSet.MoveNext
    Loop
End Sub
Run Code Online (Sandbox Code Playgroud)

正在打开的记录集如下:

SELECT ID, EXEC_TM, Due, TAM
FROM FRT
ORDER BY ID, EXEC_DT, EXEC_TM, D_C_CD, SEQ_NBR, TAM DESC
Run Code Online (Sandbox Code Playgroud)

我搜索了SO并找到了这个.我查看了游标和其他方法,如何为存储过程写这个,我无法弄清楚重写这个的正确方法.

任何人都可以提供任何建议吗?我应该使用临时表吗?我以前没有这样做过,我很难理解如何继续.

编辑:

Sample Data
Original:

ID         EXEC_TM    Due        TAM
12345678   12343811   $9250.81   $-6561.91
12345678   12343822   $9250.81   $-4374.63
12345678   15581917   $9250.81   $-4762.76

Final Result:

ID         EXEC_TM    Due         TAM
12345678   12343811   $2688.87    $-6561.91
12345678   12343822   $-1685.76   $-4374.63
12345678   15581917   $-6448.52   $-4762.76
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 7

从流程重新设计的角度来看,汤姆的答案更好.下面的代码是您在CURSOR形式上对当前逻辑的重新编写.

我绝不赞同这种方法,但这就是你要求的.您可能需要更正数据类型等才能正常工作.

DECLARE @ID int,
        @Exec_TM int,
        @Due money,
        @TAM money,
        @ID2 int = 0,
        @Cash money


DECLARE RecSet CURSOR FOR

SELECT ID, EXEC_TM, Due, TAM
FROM FRT
ORDER BY ID, EXEC_DT, EXEC_TM, D_C_CD, SEQ_NBR, TAM DESC

OPEN RecSet
FETCH NEXT FROM RecSet INTO @ID, @Exec_TM, @Due, @TAM

WHILE (@@FETCH_STATUS = 0)  
        BEGIN  

            IF @ID <> @ID2 SET @Cash = @Due

            SET @Cash = @Cash + @TAM

            SET @ID2 = @ID

            UPDATE FRT
            SET Due = @Cash
            WHERE ID = @ID
            AND EXEC_TM = @Exec_TM
            AND Due = @Due
            AND TAM = @TAM  

            FETCH NEXT FROM RecSet INTO @ID, @Exec_TM, @Due, @TAM

        END


CLOSE RecSet
DEALLOCATE RecSet
Run Code Online (Sandbox Code Playgroud)