Sql server 为T-SQL变量分配的内存在哪里?
在T-SQL中,当我们执行以下操作时Sql server 为T-SQL变量分配的内存在哪里?,sql-server,tsql,memory,stack,heap,Sql Server,Tsql,Memory,Stack,Heap,在T-SQL中,当我们执行以下操作时 declare @PolicyId int = 20 分配了4个字节,因为int的大小是4个字节,但是这个内存分配在哪里?是在堆栈上还是在堆上?T-SQL变量既不在堆栈上,也不在堆上。它们是当前执行上下文中命名的逻辑实体。将declare放置在循环内与将其放置在循环外是相同的。在循环中放置变量不会导致内存耗尽或堆栈溢出。请参阅以下代码: declare @i int =0 while @i<2 begin declare @x int = 0
declare @PolicyId int = 20
分配了4个字节,因为
int
的大小是4个字节,但是这个内存分配在哪里?是在堆栈上还是在堆上?T-SQL变量既不在堆栈上,也不在堆上。它们是当前执行上下文中命名的逻辑实体。将declare放置在循环内与将其放置在循环外是相同的。在循环中放置变量不会导致内存耗尽或堆栈溢出。请参阅以下代码:
declare @i int =0
while @i<2
begin
declare @x int = 0;
set @x += 1
print @x;
set @i += 1;
end
print @x;
声明@i int=0
当@iAnd您需要知道的原因是…?我正在查看一个存储过程,wheares在while循环中声明了一个变量,我想知道这会带来什么,垃圾收集(heap)或者堆栈溢出。也许你更应该担心的是消除循环,而不是弄清楚当它崩溃时会发生什么类型的异常。这可能取决于声明的上下文,例如在存储过程或循环中,以及数据类型,例如INT
,而不是TABLE
@Pritesh我不相信这一点。几乎T-SQL中的每个循环都可以更改为无循环的基于集合的操作。有时最好将其留在循环中,但这种情况很少发生(在SQLServer2012之前,运行totals是一种游标优于纯粹的基于集合的解决方案的情况)。如果你担心你的循环破坏了你的服务器,也许值得考虑一下,而不是把你的手扔在空中,相信循环是必要的。