我编写了一些声明TABLE和CURSOR的脚本。在脚本结束时,我释放了CURSOR。我还应该解除分配表吗?
DECLARE @MyTable TABLE (columns);
INSERT @MyTable(columns) VALUES (values)
INSERT @MyTable(columns) VALUES (values)
...
DECLARE workorders SCROLL CURSOR FOR
SELECT (rest of statement);
... work...
CLOSE workorders;
DEALLOCATE workorders;
答案 0 :(得分:3)
table variable
的范围与特定批次一起使用。因此,您不必明确对drop/deallocate
表变量占用的空间做任何事情。
table variable
占用的空间将在创建它的批处理结束时自动删除
答案 1 :(得分:1)
首先,你可以避开光标吗?如果是这样,请以基于集合的方式重写代码(一次操作多行,而不是一次一行)。
其次,如果你不能,你可以使用LOCAL FAST_FORWARD游标吗?
第三,你是对的 - 你肯定需要释放光标。
第四,您将多行放入@table变量doesn't have statistics。
不要这样做 - 改为使用#temp表,并通过使用Profiler for SQL查看是否在其上放置索引是净收益还是净损失:BatchCompleted,并查看Reads ,写入,CPU和持续时间!
第五,一般来说,在完成这些表后放弃#temp表是一种很好的做法。你不需要为@table变量而烦恼。