Я столкнулся с интересным сценарием (по крайней мере, для меня) в хранимой процедуре. Хотелось бы услышать мнение специалистов и мысли по этому поводу.
DECLARE @loopcounter INT
SET @loopcounter=10
WHILE @loopcounter > 0
BEGIN
DECLARE @insidevalue int
IF (@loopcounter%2 = 0)
SET @insidevalue = @loopcounter
PRINT 'Value_' + CAST(@insidevalue AS NVARCHAR) + '_'
SET @loopcounter = @loopcounter - 1
END
Я ожидал, что этот блок выдаст результат, как показано ниже.
Value_10_ Value_ _ Value_8_ Value_ _ Value_6_ Value_ _ Value_4_ Value_ _ Value_2_ Value_ _
Вместо этого я получил вывод, как показано ниже:
Значение_10_
Значение_10_
Значение_8_
Значение_8_
Значение_6_
Значение_6_
Значение_4_
Значение_4_
Значение
Value_10_ Value_ _ Value_8_ Value_ _ Value_6_ Value_ _ Value_4_ Value_ _ Value_2_ Value_ _Значение
Value_10_ Value_ _ Value_8_ Value_ _ Value_6_ Value_ _ Value_4_ Value_ _ Value_2_ Value_ _
Я думал, что если я объявлю переменную внутри блока while, то для каждой итерации она будет сбрасывать значение на NULL или значение по умолчанию (из фона С#).
Если это задумано, то мой вопрос заключается в том, как SQLServer обрабатывает оператор DECLARE для этой переменной внутри блока while? Игнорирует ли он это, поскольку переменная уже находится в памяти?
Может кто-нибудь объяснить мне это поведение?