为什么块范围变量存在于块之外?

时间:2014-12-03 12:24:07

标签: sql-server tsql

我有以下存储过程来测试变量范围

alter proc updatePrereq
    @pcntr int, 
    @pmax int
as
begin 

    if @pcntr = 1
    begin 
        declare @i int
        set @i= @pcntr
    end

    set @i=@pcntr
    select @i;
end
go

在上面的脚本中@i仅在@pcntr值为1时在if块中声明。假设从该脚本中调用上述存储过程5次

declare @z int
set @z = 1

declare @max int
set @max = 5

while @z <= @max
begin 
    exec dbo.updatePrereq @z, @max
    set @z = @z + 1
end
go

正如我之前所说,@i变量仅在@pcntr1时才存在。因此,当我第二次调用存储过程时,控件无法进入if块,因此@i变量甚至不存在。但是脚本会在每次迭代中打印@i中的值,如果@i值大于{{1}时出现@pcntr变量不存在,则会出现错误}?

here is video showing this issues 感谢

1 个答案:

答案 0 :(得分:4)

变量的范围是可以引用变量的Transact-SQL语句的范围。变量的范围从声明它的位置延迟到声明它的批处理或存储过程的结尾。 (来源: MSDN

其范围不会以If satement

结束