2013-02-19 19 views
5

Perché can Posso dichiarare lo stesso nome di variabile in un ciclo ma non consentito senza un ciclo?Variabile del server SQL: loop vs duplicate?

DECLARE @loop INT 

SET @loop = 0 

WHILE @loop<5 
BEGIN 
    DECLARE @t INT -- <-- This is called multiple times 
    SET @t = 1 
    SET @loop = @loop+1 
    SELECT @loop 
END 
  • Questo eseguirà: 1,2,3,4,5

mentre questo:

DECLARE @t INT 
    SET @t = 1 
    DECLARE @t INT 
    SET @t = 1 

sarà ovviamente dire:

  • Il il nome della variabile '@t' è già stato dichiarato.

risposta

6

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.

+0

nel ciclo while dichiarerà la variabile '@ t' 5 volte? – vikas

+0

@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. –

+0

come dichiarazione di variabili all'interno di loop in C#, o qualcos'altro – vikas