sql >> データベース >  >> RDS >> Sqlserver

SQLサーバー変数:ループと重複?

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

    宣言を含むコードのブロックが何回実行されたかに関係なく、実際には1つの変数のみを宣言します。

    DECLARE それ自体は実行可能ステートメントではありません。例:

    IF 1 = 0
    BEGIN
    DECLARE @I INT
    END
    
    SELECT @I
    

    そのブロックが入力されていなくても、正常に動作します。変数のメモリは、クエリの実行が開始される前のコンパイル時に予約されます。実行コンテキスト

    これを確認する1つの方法は

    です。
    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);
    

    これは、現在のクエリ用に予約されているメモリを示しています。宣言された変数の数を調整すると、DECLAREであっても、予約されているメモリが変更されます。 ブロックはバッチの最後にあります。




    1. SSIS のユーザー変数値に基づいてデータ フローで if..else を使用する方法

    2. MapReduceがHadoopでどのように機能するか

    3. MySQL c#接続文字列フェイルオーバー

    4. パーセントを計算する方法は?