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)
如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。
不,您不能将游标行中的标量值提取到表变量中。您必须声明变量,获取它们,然后插入:
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 年代的平面文件处理……更糟糕的是,有太多列声明这些变量会让人望而却步。