的放置DECLARE
无关紧要(除了解析器不允许您在 之前尝试使用它DECLARE
)
它实际上只声明了一个变量,而不管包含该声明的代码块被执行了多少次。
DECLARE
本身不是可执行语句。例如
IF 1 = 0
BEGIN
DECLARE @I INT
END
SELECT @I
即使从未输入该块也可以正常工作。变量的内存在编译时保留,甚至在执行上下文中开始执行查询之前。
看到这一点的一种方法是
DBCC FREEPROCCACHE;
GO
SELECT m2.pages_allocated_count
--If 2012 use the next line instead
--,m2.pages_in_bytes/m2.page_size_in_bytes as pages_allocated_count
,m2.page_size_in_bytes
FROM sys.dm_exec_cached_plans cp
CROSS apply sys.dm_exec_sql_text(cp.plan_handle) t
JOIN sys.dm_os_memory_objects m1 ON m1.memory_object_address = cp.memory_object_address
JOIN sys.dm_os_memory_objects m2 ON m1.page_allocator_address = m2.page_allocator_address
WHERE text LIKE '%this query%'
AND m2.type = 'MEMOBJ_EXECUTE'
DECLARE @A0 VARCHAR(8000);
DECLARE @A1 VARCHAR(8000);
DECLARE @A2 VARCHAR(8000);
DECLARE @A3 VARCHAR(8000);
DECLARE @A4 VARCHAR(8000);
DECLARE @A5 VARCHAR(8000);
DECLARE @A6 VARCHAR(8000);
DECLARE @A7 VARCHAR(8000);
DECLARE @A8 VARCHAR(8000);
DECLARE @A9 VARCHAR(8000);
DECLARE @A10 VARCHAR(8000);
DECLARE @A11 VARCHAR(8000);
DECLARE @A12 VARCHAR(8000);
DECLARE @A13 VARCHAR(8000);
DECLARE @A14 VARCHAR(8000);
DECLARE @A15 VARCHAR(8000);
DECLARE @A16 VARCHAR(8000);
DECLARE @A17 VARCHAR(8000);
DECLARE @A18 VARCHAR(8000);
DECLARE @A19 VARCHAR(8000);
DECLARE @A20 VARCHAR(8000);
它显示了为当前查询保留的内存,如果您调整声明的变量数量,您将看到保留的内存更改,即使该DECLARE
块位于批处理末尾。