Почему переменная, объявленная внутри оператора 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".