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.