Область переменных SQL Server в хранимой процедуре

Я хотел бы объявить переменную в инструкции if/else в хранимой процедуре SQL Server. Я понимаю, что это совершенно невозможно, потому что SQL Server не выполняет управление памятью в отношении объявления переменных внутри процедур. Есть ли способ иметь переменную, скопированную в операторе if/else, а затем переопределить переменную с тем же именем в другой инструкции 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

Из книги онлайн:

Объем переменной - это диапазон операторов Transact-SQL, которые могут ссылаться на переменную. Объем переменной длится от той точки, которую объявляется до конца партии или хранимой процедуры, в которой она объявлена.

Однако. Ничто не мешает вам сделать это:

create procedure Foo as begin

declare @bob int

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

end

Ответ 2

Нет, SQL довольно забавный/странный, как будто

Объявить переменную перед if exists блоком кода

так

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

Ответ 4

Есть ли причина, по которой вы не можете сделать:

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

Ответ 5

Вы можете использовать динамический 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