为什么即使条件求值为false,也会在IF语句中声明变量?

时间:2010-06-01 19:14:44

标签: sql sql-server tsql

由于永远不会声明@A,因此sql server应该抛出错误,但事实并非如此。那是为什么?

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

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

感谢名单

2 个答案:

答案 0 :(得分:18)

SQL Server没有块级变量作用域。

这是每批/存储过程等

From MSDN(我的大胆)

  

变量的范围是范围   可以的Transact-SQL语句   引用变量。范围   变量从它的位置持续   声明直到批次结束或   存储过程   声明。

答案 1 :(得分:5)

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。 e.g。

DECLARE @a VARCHAR(100) = NULL

运行此修改版本时,它会显示“已更改”,然后显示“为空”。