Почему переменная, объявленная внутри оператора IF, создается даже тогда, когда условие оценивается как ложное? - PullRequest
17 голосов
/ 01 июня 2010

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

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

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

* 1004 спасибо *

Ответы [ 2 ]

18 голосов
/ 01 июня 2010

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

Это за пакет / сохраненный процесс и т. Д.

От MSDN (мой жирный)

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

5 голосов
/ 02 июня 2010

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

DECLARE @a VARCHAR(100) = NULL

Когда эта измененная версия запущена, она отображает «изменено», а затем «равно нулю».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...