Область переменных 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
Ответ 3
Нет.
Microsoft заявила, что не исправит это:
https://connect.microsoft.com/SQLServer/feedback/details/537275/make-it-possible-to-declare-variables-that-are-only-visible-within-a-block
Ответ 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