【问题标题】:Update statement not working within Cursor & While block更新语句在 Cursor 和 While 块中不起作用
【发布时间】:2018-04-16 23:17:45
【问题描述】:

我正在尝试对表执行更新语句。该语句放置在 Cursor 和 While 块中。我已经检查了调试器并且值正在进入语句和变量中,但更新仍然没有将值放入表字段中。请告知我在这里做错了什么。

ALTER PROCEDURE SP_PO1  @P1 int

AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @DOC AS INT;
    DECLARE @CASH AS FLOAT;
    DECLARE @TENTYPE AS VARCHAR(100);
    DECLARE @UDF AS VARCHAR(100);
    DECLARE @COUNTER AS INT;
    DECLARE @SQL AS VARCHAR(500);

    SELECT @DOC=DOCTYPE FROM InvNum WHERE AutoIndex = @P1;
    IF @DOC = 6
        BEGIN
            SET @COUNTER = 1;
            DECLARE Cur_Tender CURSOR FOR
                SELECT Tender.TenderNo FROM Tender;

            OPEN CUR_TENDER;
            FETCH NEXT FROM CUR_TENDER INTO @TENTYPE;

            WHILE @@FETCH_STATUS = 0
            BEGIN

            SELECT    @CASH = ISNULL(_btblPOSTenderTx.fTxAmount,0) FROM _btblPOSTenderTx INNER JOIN Tender ON _btblPOSTenderTx.iTenderID = Tender.IdTender INNER JOIN _btblPOSXZTable ON _btblPOSTenderTx.iPOSXZTableID = _btblPOSXZTable.IDPOSXZTable WHERE (_btblPOSXZTable.iTillTxType = 7) and (_btblPOSXZTable.IDPOSXZTable = (select Max(IDPOSXZTable) from [dbo].[_btblPOSXZTable])) AND (TenderNo = @TENTYPE);

                SET @UDF = 'ufIDPOSInvTENDER' + CONVERT(VARCHAR(2),@COUNTER);

                UPDATE InvNum SET @UDF=@CASH WHERE AutoIndex = @P1;

                SET @COUNTER = @COUNTER + 1;

                FETCH NEXT FROM CUR_TENDER INTO @TENTYPE;
            END
        END
    CLOSE CUR_TENDER
    DEALLOCATE CUR_TENDER
END
GO

【问题讨论】:

    标签: sql-server tsql while-loop cursor


    【解决方案1】:

    你更新变量

     UPDATE InvNum SET @UDF=@CASH WHERE AutoIndex = @P1;
    

    更新表列

     UPDATE InvNum SET <column>=@CASH WHERE AutoIndex = @P1;
    

    如果你想要一个动态列名 - 使用动态 sql

     EXEC('UPDATE InvNum SET ' + @UDF + '=' + CAST(@CASH as VARCHAR(50) + ' WHERE AutoIndex = ' + CAST(@P1 as VARCHAR(5) ' );
    

    【讨论】:

    • 列名是动态生成的。共有 5 列如下:ufIDPOSInvTENDER1、ufIDPOSInvTENDER2、ufIDPOSInvTENDER3、ufIDPOSInvTENDER4、ufIDPOSInvTENDER5
    • 嗨,我明白你的意思了。该语句实际上是为另一个变量赋值。在这种情况下,您能解释一下解决方案吗?
    • 生成sql字符串并执行
    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2013-07-06
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多