sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-servervariabel:loop vs duplicate?

Placeringen av DECLARE är oväsentligt (förutom att parsern inte tillåter dig att försöka använda den innan DECLARE )

Den deklarerar faktiskt bara en variabel, oavsett hur många gånger kodblocket som innehåller deklarationen exekveras.

DECLARE är inte i sig ett körbart uttalande. t.ex.

IF 1 = 0
BEGIN
DECLARE @I INT
END

SELECT @I

Fungerar bra även om det blocket aldrig skrivs in. Minnet för variablerna reserveras vid kompilering innan exekvering av frågan ens börjar i exekveringskontext .

Ett sätt att se detta är

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

som visar minne reserverat för den aktuella frågan, om du justerar antalet variabler som deklareras kommer du att se det reserverade minnet ändras även om DECLARE blocket är precis i slutet av satsen.




  1. Oracle SQL PLS-00049:dålig bindningsvariabel

  2. Hur man konverterar decimal till hexadecimal med TO_CHAR() i Oracle

  3. Hur returnerar jag flera resultatuppsättningar med SqlCommand?

  4. Hur man väljer den senaste uppsättningen daterade poster från en mysql-tabell