L'immissione del DECLARE
è irrilevante (tranne il parser non vi permetterà di provare e utilizzarlo prima che la DECLARE
)
E 'solo in realtà dichiara una variabile indipendentemente dal numero di volte il blocco di il codice contenente la dichiarazione viene eseguito.
Il DECLARE
non è di per sé una dichiarazione eseguibile. per esempio.
IF 1 = 0
BEGIN
DECLARE @I INT
END
SELECT @I
funziona bene, anche se quel blocco non è mai entrato. La memoria per le variabili è riservata al momento della compilazione prima che l'esecuzione della query inizi anche nel execution context.
Un modo di vedere questo è
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);
che mostra la memoria riservata per la query corrente, se si regola il numero di variabili dichiarate si vedrà la memoria riservata cambiamento, anche se il blocco DECLARE
è proprio al fine del lotto.
fonte
2013-02-19 17:40:03
nel ciclo while dichiarerà la variabile '@ t' 5 volte? – vikas
@vikas - No. Le istruzioni 'DECLARE' non fanno nulla in fase di esecuzione. Nello stesso modo in cui nel codice di esempio nella mia risposta il blocco viene eseguito 0 volte ma la variabile è ancora effettivamente dichiarata. –
come dichiarazione di variabili all'interno di loop in C#, o qualcos'altro – vikas