sql-server - 游标循环内的表变量

标签 sql-server tsql

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

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

但它变得更加困惑。如果你试图查询游标外的 temptable,你会得到一个错误。似乎临时表是这种情况的唯一正确方法?

最佳答案

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

所以在游标内部的每个循环中,您都需要从表变量中删除数据

我知道在声明游标内的每个循环表变量时很奇怪,但这就是它的工作方式

在外部声明表变量并在CURSOR内部执行Insert/Delete语句

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
....

关于sql-server - 游标循环内的表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805126/

相关文章:

sql - 在 SQL Server 中查找日期的简单选择查询问题

sql-server - 将 IF EXISTS 与存储过程一起用作参数

sql - 在事件表上更新 id 列的标识规范

sql-server - 在两个表的同一列上查找缺失值

sql-server-2008 - tsql - 使用 SUBSTRING 提取字符串

sql - 创建以月份范围作为列的 SQL 表并使用表数据填充字段

sql - 如何使用用户创建SQL Server数据库?

sql - 是否可以在 Count() 中指定条件?

sql-server - 数据库镜像: Cannot set witness in Microsoft SQL Server 2014 using Azure

sql - 将一条记录链接到单独表中的多条记录