La colocación del DECLARE
es irrelevante (excepto que el analizador no le permitirá intentar usarlo antes de DECLARE
)
En realidad, solo declara una variable independientemente de cuántas veces se ejecute el bloque de código que contiene la declaración.
El DECLARE
no es en sí mismo una declaración ejecutable. por ejemplo
IF 1 = 0
BEGIN
DECLARE @I INT
END
SELECT @I
Funciona bien a pesar de que ese bloque nunca se ingresa. La memoria para las variables se reserva en el momento de la compilación antes incluso de que comience la ejecución de la consulta en el contexto de ejecución .
Una forma de ver esto es
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);
que muestra la memoria reservada para la consulta actual, si ajusta la cantidad de variables declaradas, verá que la memoria reservada cambia aunque DECLARE
el bloque está justo al final del lote.