Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Variabile del server SQL:ciclo vs duplicato?

Il collocamento del DECLARE è irrilevante (tranne che il parser non ti permetterà di provare a usarlo prima del DECLARE )

In realtà dichiara solo una variabile indipendentemente da quante volte viene eseguito il blocco di codice contenente la dichiarazione.

Il DECLARE non è di per sé un'istruzione eseguibile. es.

IF 1 = 0
BEGIN
DECLARE @I INT
END

SELECT @I

Funziona bene anche se quel blocco non viene mai inserito. La memoria per le variabili viene riservata al momento della compilazione prima ancora che l'esecuzione della query inizi nel contesto di esecuzione .

Un modo per vederlo è

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 modifichi il numero di variabili dichiarate vedrai la memoria riservata cambiare anche se il DECLARE il blocco si trova proprio alla fine del batch.