相关疑难解决方法(0)

TSQL游标如何检查是否已经声明并因此解除分配

在尝试再次打开游标之前,如何确保我已经存在游标?

对于一张桌子,我可以使用类似的东西:

if exists (select top 1 from tempdb.sys.tables where name = '##tmpTable') 
    drop table ##tmpTable;  
... then I can recreate my ##tmpTable 
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何为光标做这样的事情

-- First clean up if already exists..
  .....                                  <----- what goes here???

-- Declare and use a cursor
DECLARE  someCursorName CURSOR 
 FOR 
  select something from somewhere
 FOR READ ONLY
Run Code Online (Sandbox Code Playgroud)

我这样做是为了确保我的脚本在开始工作之前清理干净

我能想出的最好的是:

begin try DEALLOCATE someCursorName ; end try begin catch end catch
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯吗?

编辑:这是maintennance脚本.在我们大量客户定制的数据库中,可以有许多表,光标用于在表中运行统计分析 - 根据表的类型,会发生不同的事情.基本上很多动态的sql.如果脚本失败,我希望能够重复这项工作而不必担心人工干预.这里只有一个范围.

像所有事情一样,我很乐意用set操作替换游标.这些是游标循环所做的事情:

  • 构造sql重组/重建索引(orginally有手动sql来确定要运行的DDL,然后发出DDL)
  • 分析不同表中的数据传播和错误
  • 查找日志中的错误并查找适当的表并获取该数据 (或者有手动sql来确定错误所在的位置,然后剪切并粘贴模板以查找错误类型的错误)

t-sql sql-server cursor

7
推荐指数
1
解决办法
4638
查看次数

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

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

  1. 我应该在TRY CATCH块内声明光标吗?如果是,我应该在声明之前还是之后声明游标BEGIN TRANSACTION
  2. 我应该在BEGIN TRANSACTION语句之前还是之后打开游标?
  3. 我应该在COMMIT TRANSACTION语句之前还是之后关闭并释放游标吗?
  4. 如果出现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

    -- …
Run Code Online (Sandbox Code Playgroud)

sql transactions cursor sql-server-2012

5
推荐指数
1
解决办法
4916
查看次数

标签 统计

cursor ×2

sql ×1

sql-server ×1

sql-server-2012 ×1

t-sql ×1

transactions ×1