我想在SQL Server存储过程的if / else语句中声明一个变量。我知道这是不可能的,因为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
答案 0 :(得分:22)
来自books online:
变量的范围是可以引用变量的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
答案 1 :(得分:6)
不,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
答案 2 :(得分:3)
你有什么理由不能这样做:
declare @bob int
if exists(x)
begin set @bob = 1 end
else
begin set @bob = 2 end
答案 3 :(得分:2)
您可以使用动态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