Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么块范围变量存在于块之外?_Sql Server_Tsql - Fatal编程技术网

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

Sql server 为什么块范围变量存在于块之外?,sql-server,tsql,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 在上面的脚本中,仅当@pcntr值为1时,@i才在if块中声明。假设上述存储过程在此

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

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
在上面的脚本中,仅当@pcntr值为1时,@i才在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
declare@z int
设置@z=1
声明@max int
设置@max=5

而@z变量的范围是可以引用该变量的Transact-SQL语句的范围。变量的作用域从声明它的点一直持续到声明它的批处理或存储过程结束。(来源:


如果变量的作用域是可以引用该变量的Transact-SQL语句的范围,则它的作用域不以
结束。变量的作用域从声明它的点一直持续到声明它的批处理或存储过程结束。(来源:


如果两种情况下的satement

给出相同的结果,则其范围不在
结束。但在我的例子中,它应该打印“1”,并且应该为其他迭代抛出一个错误,不是吗?但事实并非如此!应该是,但它没有抛出错误!这就是为什么我贴这个!让我把一段youtube视频放到second@PhillGreggan-对不起,第一次没有正确阅读您的提问。变量的范围不以if条件结束。它的范围是直到批次结束或存储procedure@NoDisplayName-存储过程的结束是存储过程底部的结束标记,对吗?如果仍然如此,则应在第二轮so中要求重新声明@i变量forth@PhillGreggan-不,它不会问的。看看这个。在这两种情况下给出相同的结果。但在我的例子中,它应该打印“1”,并且应该为其他迭代抛出一个错误,不是吗?但事实并非如此!应该是,但它没有抛出错误!这就是为什么我贴这个!让我把一段youtube视频放到second@PhillGreggan-对不起,第一次没有正确阅读您的提问。变量的范围不以if条件结束。它的范围是直到批次结束或存储procedure@NoDisplayName-存储过程的结束是存储过程底部的结束标记,对吗?如果仍然如此,则应在第二轮so中要求重新声明@i变量forth@PhillGreggan-不,它不会问的。看看这个。