存储过程中的SQL Server变量作用域

时间:2011-05-13 16:27:08

标签: sql sql-server

我想在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

4 个答案:

答案 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