Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Server-Variable:Schleife oder Duplikat?

Die Platzierung des DECLARE ist unerheblich (außer dass der Parser es Ihnen nicht erlaubt, es vor dem DECLARE zu versuchen und zu verwenden )

Es deklariert tatsächlich nur eine Variable, unabhängig davon, wie oft der Codeblock, der die Deklaration enthält, ausgeführt wird.

Das DECLARE ist an sich keine ausführbare Anweisung. z. B.

IF 1 = 0
BEGIN
DECLARE @I INT
END

SELECT @I

Funktioniert gut, obwohl dieser Block nie betreten wird. Der Speicher für die Variablen wird zur Kompilierungszeit reserviert, bevor die Ausführung der Abfrage überhaupt beginnt, im Ausführungskontext .

Eine Möglichkeit, dies zu sehen, ist

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);

was den für die aktuelle Abfrage reservierten Speicher anzeigt, wenn Sie die Anzahl der deklarierten Variablen anpassen, sehen Sie, dass sich der reservierte Speicher ändert, obwohl DECLARE Block steht ganz am Ende des Stapels.