Область переменных, которые определены в блоке while в хранимых процедурах - SQl Server

Я столкнулся с интересным сценарием (по крайней мере, для меня) с хранимой процедурой. Хотелось бы узнать мнение и мнение экспертов по этому поводу.

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_

Ценность_ _

Значение_8_

Ценность_ _

Значение_6_

Ценность_ _

Значение_4_

Ценность_ _

Значение_2_

Ценность_ _

Вместо этого я получил следующий вывод:

Значение_10_

Значение_10_

Значение_8_

Значение_8_

Значение_6_

Значение_6_

Значение_4_

Значение_4_

Значение_2_

Значение

Я подумал, что если я объявлю переменную внутри блока while, то для каждой итерации будет сброшено значение NULL или значение по умолчанию (из фона C #).

Если это сделано намеренно, то мой вопрос: как работает SQLServer обработать оператор DECLARE для этой переменной внутри блока while? Он игнорирует это, поскольку переменная уже находится в памяти?

Кто-нибудь, пожалуйста, объясните мне это поведение?

26
задан Flimzy 6 June 2018 в 08:48
поделиться