由于永远不会声明@A,因此sql server应该抛出错误,但事实并非如此。那是为什么?
DECLARE @i int = 1;
IF @i > 10
BEGIN
DECLARE @A int = 100;
END
PRINT @A; // doesn't return any result
感谢名单
答案 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
运行此修改版本时,它会显示“已更改”,然后显示“为空”。