游标循环内的表变量

Sli*_*ipe 3 t-sql sql-server

我注意到当我在游标循环中声明一个表变量时,该变量会在游标生命周期内保持不变。我的问题是,是否有一种方法可以声明变量,使其生命周期仅在迭代中持续存在?这是一个示例:

DECLARE @SourceTable TABLE(Id INT IDENTITY(1,1),Remarks VARCHAR(10))
INSERT INTO @SourceTable VALUES ('First')
INSERT INTO @SourceTable VALUES ('Second')
INSERT INTO @SourceTable VALUES ('Third ')

/* declare variables */
DECLARE @variable INT

DECLARE my_cursor CURSOR FAST_FORWARD READ_ONLY FOR SELECT Id FROM @SourceTable

OPEN my_cursor

FETCH NEXT FROM my_cursor INTO @variable

WHILE @@FETCH_STATUS = 0
BEGIN
    --Dose not creates a new instance
    DECLARE @VarTable TABLE (Remarks VARCHAR(10))

    INSERT INTO @VarTable
    SELECT TOP 1 Remarks FROM @SourceTable
    WHERE Id = @variable


    --Works as intended if you drop when done
    CREATE TABLE #TempTable  (Remarks VARCHAR(10))

    INSERT INTO #TempTable
    SELECT TOP 1 Remarks FROM @SourceTable
    WHERE Id = @variable

    DROP TABLE #TempTable

    FETCH NEXT FROM my_cursor INTO @variable
END

CLOSE my_cursor
DEALLOCATE my_cursor

SELECT * FROM @VarTable
Run Code Online (Sandbox Code Playgroud)

但它变得更加混乱。如果您尝试在游标外查询临时表,则会出现错误。似乎临时表是这种情况的唯一正确方法?

Pரத*_*ீப் 5

TSQL变量的范围是从它的声明到批处理结束。

所以在内部游标每个循环中,您需要从中删除数据 table variable

我知道奇怪的是,在游标内的每个循环表变量中都声明了它,但这就是它的工作原理

在外面声明表变量并在里面执行插入/删除语句 CURSOR

DECLARE @VarTable TABLE (Remarks VARCHAR(10))

DECLARE my_cursor CURSOR FAST_FORWARD READ_ONLY FOR SELECT Id FROM @SourceTable

OPEN my_cursor
.......
.......
  DROP TABLE #TempTable

  DELETE FROM @VarTable

  FETCH NEXT FROM my_cursor INTO @variable
END
....
Run Code Online (Sandbox Code Playgroud)