Почему переменная, объявленная внутри оператора IF, создается даже тогда, когда условие оценивается как false?

Так как @A никогда не объявляется, сервер sql должен вызывать ошибку, но это не так. Почему это?

DECLARE @i int = 1;
IF @i > 10
BEGIN
  DECLARE @A int = 100;
END

PRINT @A; // doesn't return any result

спасибо

Ответы

Ответ 1

SQL Server не имеет видимости переменных уровня блока.

Он за пакетную/сохраненную передачу и т.д.

Из MSDN (мой жирный шрифт)

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

Ответ 2

gbn ответил на вопрос, но в соответствующей заметке обратите внимание на такой код:

DECLARE @i INT = 0
WHILE @i < 2
BEGIN
    DECLARE @a VARCHAR(100)

    IF @i = 0
        SET @a = 'changed'

    PRINT COALESCE(@a, 'is null')   
    SET @i = @i + 1
END

При запуске дважды печатается "изменено" , в то время как многие люди, вероятно, ожидают, что он напечатает "изменено" , затем "равно null". Будьте осторожны при объявлении переменных внутри циклов. Возможно, вы захотите явно указать значение NULL в объявлении. например.

DECLARE @a VARCHAR(100) = NULL

Когда эта модифицированная версия запущена, она отображает "изменено" , затем "равно null".