gpt4 book ai didi

sql - 在事务内部或外部打开和关闭游标以及如何在事务失败时关闭游标

转载 作者:行者123 更新时间:2023-12-04 20:08:55 25 4
gpt4 key购买 nike

我正在 SQL Server 2012 中编写一个存储过程,该过程使用游标进行读取,并在 TRY CATCH 中使用事务。堵塞。基本上,我的问题如下:

  • 我应该在 TRY CATCH 中声明我的光标吗?堵塞?如果是,我应该在 BEGIN TRANSACTION 之前或之后声明游标吗?陈述?
  • 我应该在 BEGIN TRANSACTION 之前还是之后打开光标陈述?
  • 我应该在 COMMIT TRANSACTION 之前还是之后关闭并释放光标陈述?
  • 我应该在 ROLLBACK TRANSACTION 之前还是之后关闭并释放光标声明如果失败?

  • 示例 T-SQL 代码:
    DECLARE @ColumnID AS INT;
    DECLARE @ColumnName AS VARCHAR(20);
    DECLARE @ColumnValue AS FLOAT;

    -- Should I declare my cursor inside the TRY CATCH block?
    -- If yes, should I declare the cursor before or after the BEGIN TRANSACTION statement?

    DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT
    a.ColumnID,
    a.ColumnName,
    a.ColumnValue

    FROM
    MyTable a;

    BEGIN TRY

    -- Should I open the cursor before or after the BEGIN TRANSACTION statement?

    BEGIN TRANSACTION myTransaction;

    OPEN myCursor;

    FETCH NEXT FROM myCursor INTO @ColumnID, @ColumnName, @ColumnValue;

    WHILE @@FETCH_STATUS = 0 BEGIN

    IF (@ColumnName IS NULL) BEGIN

    UPDATE
    MyTable

    SET
    @ColumnValue = NULL

    WHERE
    ColumnID = @ColumnID;

    END;

    FETCH NEXT FROM myCursor INTO @ColumnID, @ColumnName, @ColumnValue;

    END;

    -- Should I close and deallocate the cursor before or after the COMMIT TRANSACTION statement?

    CLOSE myCursor;
    DEALLOCATE myCursor;

    COMMIT TRANSACTION myTransaction;

    END TRY
    BEGIN CATCH

    -- Should I close and deallocate the cursor before or after the ROLLBACK TRANSACTION statement:

    IF CURSOR_STATUS('local', 'myCursor') = 1 BEGIN

    CLOSE myCursor;
    DEALLOCATE myCursor;

    END;

    ROLLBACK TRANSACTION myTransaction;

    END CATCH;

    最佳答案

    我会在 BEGIN TRY 之前声明并打开游标然后在 END CATCH 之后关闭并释放它以最大限度地减少您在交易中花费的时间。这也意味着您不需要两次编写 close/deallocate 语句。

    我的第二个选择是在 BEGIN TRANSACTION 中声明并打开游标。然后在 ROLLBACK 之前关闭并释放.我相信其他人会更喜欢这种风格。

    这些方式游标要么完全在 try/catch 和事务之外,要么完全包含在其中。否则对我来说感觉就像跨越了范围,但肯定仍然有效。我觉得这个问题主要是风格问题

    关于sql - 在事务内部或外部打开和关闭游标以及如何在事务失败时关闭游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21225324/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com