Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为T-SQL变量分配的内存在哪里?_Sql Server_Tsql_Memory_Stack_Heap - Fatal编程技术网

Sql server 为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

在T-SQL中,当我们执行以下操作时

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是一种游标优于纯粹的基于集合的解决方案的情况)。如果你担心你的循环破坏了你的服务器,也许值得考虑一下,而不是把你的手扔在空中,相信循环是必要的。