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

Asp*_*Net 18 sql t-sql sql-server

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

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

PRINT @A; // doesn't return any result
Run Code Online (Sandbox Code Playgroud)

感谢名单

gbn*_*gbn 18

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

它是每批/存储过程等

来自MSDN(我的大胆)

变量的范围是可以引用变量的Transact-SQL语句的范围.变量的范围从声明它的位置延迟到声明它的批处理存储过程的结尾.

  • 并不是的.SQL不像c#那样编译或作用域,因为它是声明性的.作为开发人员DBA,我可以说c#和Java因其作用域规则而存在缺陷,变量在外部和内部块中声明.我的意思是,有2个@A vars?来吧... (3认同)

Moe*_*sko 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
Run Code Online (Sandbox Code Playgroud)

运行时,它会打印两次“更改”,而许多人可能希望它打印“更改”,然后“为空”。在循环内声明变量时要小心。您可能需要在声明中将其显式设置为NULL。例如

DECLARE @a VARCHAR(100) = NULL
Run Code Online (Sandbox Code Playgroud)

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