如何从游标中获取到表变量?

haz*_*ard 3 t-sql sql-server-2008-r2 cursors

我有一个游标定义为:

DECLARE idCursor CURSOR         
    FOR SELECT DISTINCT [id], [data]
        FROM #tempTable  
Run Code Online (Sandbox Code Playgroud)

我有一个变量定义为:

DECLARE @currentId TABLE (
                            [id] int,
                            [data] char(1)
                         );  
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将下一个结果提取到 @currentId

FETCH NEXT FROM idCursor INTO @currentId  
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Must declare the scalar variable "@currentId".  
Run Code Online (Sandbox Code Playgroud)

如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。

Aar*_*and 6

不,您不能将游标行中的标量值提取到表变量中。您必须声明变量,获取它们,然后插入:

FETCH NEXT FROM idCursor INTO @id, @data;
INSERT @currentId([id],[data]) SELECT @id, @data;
Run Code Online (Sandbox Code Playgroud)

但是,也许您根本不需要游标。为什么一次处理一行?为什么不用@table最初填充的任何查询填充变量#tempRemaining

INSERT @currentId([id], [data])
SELECT DISTINCT [id], [data]
    FROM #tempTable;
Run Code Online (Sandbox Code Playgroud)

或者甚至只是#tempTable单独使用并完全跳过表变量?甚至可能跳过#temp 表?一个游标结合一个表变量一个#temp 表听起来就像一场噩梦。

冒着听起来像 Celko 的风险,这看起来很像 1970 年代的平面文件处理……更糟糕的是,有太多列声明这些变量会让人望而却步。

  • 原始问题中已接受的解决方案不需要游标 (2认同)