Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么即使条件的计算结果为false,也会在IF语句中声明变量?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么即使条件的计算结果为false,也会在IF语句中声明变量?

Sql 为什么即使条件的计算结果为false,也会在IF语句中声明变量?,sql,sql-server,tsql,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 thanxSQL Server没有块级变量作用域 它是每批/存储过程等 (粗体) 变量的范围是范围 可以 引用变量。范围 变量从它所在的点开始持续 在批处理结束前声明或 存储过程 声明 gbn回答了这个问

由于@A从未声明过,sql server应该抛出一个错误,但它没有。为什么呢

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

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

thanx

SQL Server没有块级变量作用域

它是每批/存储过程等

(粗体)

变量的范围是范围 可以 引用变量。范围 变量从它所在的点开始持续 在批处理结束前声明或 存储过程 声明


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

当这个修改过的版本运行时,它会显示“changed”,然后显示“isnull”。

有道理,但这不是某种缺陷吗,因为可能存在这样的情况,即我们只想在满足某些条件时创建变量?不太可能。比如说,SQL不像c#那样编译或定义范围,因为它是声明性的。作为开发人员DBA,我可以说c#和Java是有缺陷的,因为它们的作用域规则,在外部和内部块中声明变量。我的意思是,有两个A队?拜托。。。
DECLARE @a VARCHAR(100) = NULL