重用具有不同参数值的 SQL Server 游标?

mir*_*lav 2 sql-server cursor sql-server-2008-r2

我想知道当值发生变化时,带参数查询的游标@variable是否可以重新使用(CLOSE+ ) 。在我看来,它总是需要+ + +才能使新值生效。也许没什么大不了的,但我想知道在使用之间是否可以省略+ 。OPEN@variableCLOSEDEALLOCATEDECLAREOPEN@variableDEALLOCATEDECLARE

这里有完整的简单示例供您尝试:

DECLARE @ta TABLE (a int);
INSERT INTO @ta (a) VALUES (1),(2),(4),(8),(16),(32),(64);
---------
DECLARE @current_a int;
DECLARE @threshold int = 12;
DECLARE crs1 CURSOR FOR SELECT a FROM @ta WHERE a < @threshold;

--- first cursor use
OPEN crs1;

    FETCH NEXT FROM crs1 INTO @current_a;
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SELECT @threshold, @current_a
            FETCH NEXT FROM crs1 INTO @current_a;
        END;    

CLOSE crs1;
DEALLOCATE crs1; -- can this be left out?

SET @threshold = 3;
DECLARE crs1 CURSOR FOR SELECT a FROM @ta WHERE a < @threshold;  -- can this be left out?

--- second cursor use
OPEN crs1;

    FETCH NEXT FROM crs1 INTO @current_a;
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SELECT @threshold, @current_a
            FETCH NEXT FROM crs1 INTO @current_a;
        END;    

CLOSE crs1;
DEALLOCATE crs1; 
Run Code Online (Sandbox Code Playgroud)

这是线性化的示例,但当外部游标更改内部游标的查询参数时,问题也适用于嵌套游标。

Luk*_*zda 5

一种方法是使用cursor variable

DECLARE 
{ 
    { @local_variable [AS] data_type  | [ = value ] }
  | { @cursor_variable_name CURSOR }
Run Code Online (Sandbox Code Playgroud)

@光标变量名称

是游标变量的名称。游标变量名称必须以 at (@) 符号开头并符合标识符规则。

光标

指定该变量是本地游标变量。

游标变量:

  • 可以是游标类型或另一个游标变量的目标。有关详细信息,请参阅 SET @local_variable。

  • 如果当前没有为游标变量分配游标,则可以在 EXECUTE 语句中将其作为输出游标参数的目标进行引用。

  • 应该算是一个指向光标的指针。

DECLARE crs1 CURSOR FOR SELECT a FROM @ta WHERE a < @threshold;
-- could be changed to
DECLARE @crs1 CURSOR;
SET @crs1 = CURSOR FOR SELECT a FROM @ta WHERE a < @threshold;
Run Code Online (Sandbox Code Playgroud)

LiveDemo