2014-12-03 3 views
0

я иметь следующую хранимую процедуру для проверки видимости переменныхПочему переменные области видимости существуют за пределами блока?

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

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

    set @[email protected] 
    select @i; 
end 
go 

В приведенном выше @i скрипта объявить в блоке, если только тогда, когда значение @pcntr равно 1. Предположим, выше хранимая процедура называется 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 переменная существует только тогда, когда @pcntr является 1. Поэтому, когда я вызываю хранимую процедуру во второй раз и т. Д., Элемент управления не может войти в блок if, поэтому переменная @i даже не существует. Но сценарий печатает значение в @i на каждой итерации. Как это возможно, если он выкинет ошибку, так как переменная @i не существует, если значения @pcntr больше, чем 1?

here is video showing this issues благодарит

ответ

4

Область действия переменной является диапазон операторов Transact-SQL, которые могут ссылаться на переменную. Объем переменной длится от той точки, которую объявляется до конца партии или хранимой процедуры, в которой она объявлена. (Источник: MSDN)

Ее сфера не заканчивается на If satement

+0

в обоих случаях дает те же результаты. Но в моем случае он должен печатать «1» и должен вызывать ошибку для других итераций, не так ли? Но это не так! –

+0

должно быть, но оно не выдавало ошибку! вот почему я разместил это! позвольте мне поставить видео youtube в секунду –

+0

Я обновил сообщение с видео –

Смежные вопросы