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