SQL Server在存储过程中何时以及如何释放变量内存?

4

当我们创建存储过程时,通常会创建一些变量,例如:

DECLARE @UserCount INT

我们在存储过程中使用了该变量。但是我们没有在存储过程的结尾处对该变量进行处理。我们使用DEALLOCATE释放游标,但我们没有为创建的变量编写任何代码行。
另一种情况是我们创建表并将它们命名为"@table"。
SQL Server何时以及如何处理这种类型的变量?
3个回答

3
根据MSDN文档:
“变量的作用域是可以引用该变量的Transact-SQL语句范围。变量的作用域从声明变量的点开始,持续到声明变量的批处理或存储过程结束。”

http://msdn.microsoft.com/en-us/library/ms187953.aspx

顺便提一下,您可能会看到临时表(#MyTable)和表变量(@MyTable)之间的性能差异非常有趣。如果我们在分析存储过程时发现表变量的使用存在性能问题,我们会尝试改用临时表来查看是否可以提高性能。


1

补充一下Bob上面的回答,特别是关于这个点

We dispose Cursors with DEALLOCATE but we don't write ant lines for variables

MSDN 表示并且我引用:

游标变量不必明确释放。当变量超出作用域时,它将自动释放。

这适用于至少 SQL Server 2000


0
正如 @Bob Palmer 所提到的,无需为变量释放内存空间。但是您需要为光标释放内存空间。 原因是存储过程中声明的每个变量都是局部变量,服务器将在存储过程执行后自动释放内存。
而对于游标,您也不需要释放内存。有关更多详细信息,请参阅此处: MSDN 文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接