복붙노트

[SQL] 저장 프로 시저에서 SQL 서버 변수 범위

SQL

저장 프로 시저에서 SQL 서버 변수 범위

나는 SQL 서버 저장 프로 시저의 경우 / 다른 문 내에서 변수를 선언하고 싶습니다. 나는 SQL 서버 프로 시저 내에서 변수 선언에 대한 메모리 관리를하지 않기 때문에이 매우 불가능하다는 것을 알고 있습니다. 는 IF / else 문에서 범위 변수를 가질 수있는 방법이 있나요, 다음 다른 경우 / 다른 성명에서 동일한 이름의 변수를 재 선언? 예를 들면 :

create procedure Foo
as
begin  
    if exists (x)
    begin
        declare @bob int
        set bob = 1
    end
    else
    begin
        declare @bob int
        set bob = 2
    end
end

해결법

  1. ==============================

    1.온라인 책에서 :

    온라인 책에서 :

    하나. 아무것도이 일에서 당신을 유지하지 :

    create procedure Foo as begin
    
    declare @bob int
    
    if exists (x)
    begin
        set @bob = 1
    end
    else
    begin
        set @bob = 2
    end
    
    end
    
  2. ==============================

    2.아니, SQL 꽤 재미 / 그런 이상한

    아니, SQL 꽤 재미 / 그런 이상한

    코드의 블록을 존재하는 경우 전에 변수를 선언

    그래서

    declare @bob int 
    set @bob = 2 
    
    if exists(x) 
    begin   
        set @bob = 1 
    end
    

    이제, 이러한 예를 살펴보고 무슨 생각하려고

    WHILE 1 = 2 --not true of course
    BEGIN
      DECLARE @VAR INT;
    END
    SET @VAR = 1;
    
    SELECT @VAR;
    

    물론이 작동하지만,이 때마다 초기화되지 않습니다

    DECLARE @loop INT
    SET @loop = 0
    
    WHILE @loop <=6
    BEGIN
            DECLARE @VAR INT
            SET @VAR = COALESCE(@VAR,0) + 1
            SET @loop = @loop +1
    END
    
    SELECT @VAR
    
  3. ==============================

    3.당신이 할 수없는 이유를 몇 가지 이유가있다 :

    당신이 할 수없는 이유를 몇 가지 이유가있다 :

    declare @bob int 
    if exists(x) 
    begin   set @bob = 1 end 
    else 
    begin  set @bob = 2 end 
    
  4. ==============================

    4.당신은 동적 SQL을 사용하여에 의존 수 :

    당신은 동적 SQL을 사용하여에 의존 수 :

    if exists (x)
    begin
        exec sp_executesql N'
            declare @bob int
            set @bob = 1
        ';
    end
    else
    begin
        exec sp_executesql N'
            declare @bob int
            set @bob = 2
        ';
    end
    
  5. from https://stackoverflow.com/questions/5994957/sql-server-variable-scope-in-a-stored-procedure by cc-by-sa and MIT license