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

gh9*_*gh9 20 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
Run Code Online (Sandbox Code Playgroud)

RTh*_*mas 24

在线书籍:

变量的范围是可以引用变量的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
Run Code Online (Sandbox Code Playgroud)


SQL*_*ace 7

不,SQL非常有趣/很奇怪

代码块之前声明变量if exists

所以

declare @bob int 
set @bob = 2 

if exists(x) 
begin   
    set @bob = 1 
end
Run Code Online (Sandbox Code Playgroud)

现在,看看这些例子并试着猜测会发生什么

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

SELECT @VAR;
Run Code Online (Sandbox Code Playgroud)

这当然有效,但每次都没有初始化

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
Run Code Online (Sandbox Code Playgroud)