Le placement du DECLARE
est sans importance (sauf que l'analyseur ne vous permettra pas d'essayer de l'utiliser avant le DECLARE
)
En fait, il ne déclare qu'une seule variable, quel que soit le nombre d'exécutions du bloc de code contenant la déclaration.
Le DECLARE
n'est pas en soi une instruction exécutable. ex.
IF 1 = 0
BEGIN
DECLARE @I INT
END
SELECT @I
Fonctionne bien même si ce bloc n'est jamais entré. La mémoire pour les variables est réservée au moment de la compilation avant même que l'exécution de la requête ne commence dans le contexte d'exécution .
Une façon de voir cela est
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);
qui montre la mémoire réservée pour la requête en cours, si vous ajustez le nombre de variables déclarées vous verrez la mémoire réservée changer même si le DECLARE
bloc est juste à la fin du lot.