2013-02-19 10 views
5

なぜできます私は同じ変数名をループに宣言しますが、はループなしでは許されません。SQLサーバー変数:ループ対重複?

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 
  • これが実行されます:1,2,3,4,5

をこのながら:

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

が明らかに言うだろう:

  • 変数名 '@t'はすでに宣言されています。

答えて

6

(パーサはあなたがDECLARE前にそれを試してみて、使用することはできませんを除く)DECLAREの配置は重要ではない

それだけで、実際に関係なく何回ブロックの一つの変数を宣言します宣言を含むコードが実行されます。

DECLAREは、それ自体が実行可能な文ではありません。例えば

IF 1 = 0 
BEGIN 
DECLARE @I INT 
END 

SELECT @I 

ブロックは入力されませんが、正常に動作します。変数のメモリは、クエリの実行がexecution contextで始まる前でもコンパイル時に予約されています。

これを見ての

一つの方法は、DECLAREブロックがで右であるにも関わらず、あなたはメモリ予約の変更が表示されます宣言した変数の数を調整した場合、現在のクエリのために確保したメモリを示し

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

ですバッチの終わり。

+0

whileループでは、変数 '@ t 'を5回宣言しますか? – vikas

+0

@vikas - いいえ '' DECLARE'文は、実行時に何もしません。同様に、私の答えのサンプルコードでは、ブロックは0回実行されますが、変数は実際にはまだ宣言されています。 –

+0

C#でのforループ内の変数宣言に似ています。 – vikas

関連する問題