Sql 为什么即使条件的计算结果为false,也会在IF语句中声明变量?
由于@A从未声明过,sql server应该抛出一个错误,但它没有。为什么呢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回答了这个问
DECLARE @i int = 1;
IF @i > 10
BEGIN
DECLARE @A int = 100;
END
PRINT @A; // doesn't return any result
thanxSQL 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