T-SQL 变量作用域
在T-sql中声明变量时,需要注意变量的作用域:
1. 变量在一个批处理过程中声明后,在这个批处理里都是有用的;局部变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。
2. 存储过程内表示一个域.走出存储过程变量作用域失效
3. 在批标识符Go结束后,变量作用域失效
例1:
declare @var int = 2; select @var; -- 正确:(1 行受影响) go select @var; --出错: 提示必须声明标量变量 go
例2: 在一个批处理过程中(或存储过程中), 在一个循环中声明变量,变量的作用域并不局限在循环中, 这与C语言、java等编程语言不同:
select * from city -- 城市表
![]()
select * from region -- 行政区表
![]()
运行结果:--声明游标 declare city_cursor cursor for select city_name, city_code from city; declare @city_name varchar(50);--城市名称 declare @city_code varchar(50);--城市编码 --打开游标 open city_cursor; fetch next from city_cursor into @city_name, @city_code; while(@@FETCH_STATUS = 0) begin declare @first_region_name varchar(50); --当前城市下的第一个行政区名称 select @first_region_name = region_name from region where city_code = @city_code; print '当前城市名称:'+ @city_name + ' 第一个行政区名称: ' + @first_region_name; fetch next from city_cursor into @city_name, @city_code; end close city_cursor; deallocate city_cursor; print '循环结束:循环中声明的变量@first_region_name的值为:' + @first_region_name;
当前城市名称:杭州 第一个行政区名称: 余杭区
当前城市名称:南京 第一个行政区名称: 白下区
当前城市名称:上海 第一个行政区名称: 白下区
循环结束:循环中声明的变量@first_region_name的值为:白下区第一次循环:查询 到“杭州” 下的第一个行政区的名称 “余杭区”,
第二次循环:查询 到“南京” 下的第一个行政区的名称 “白下区”,
第三次循环:查询 “上海” 下的第一个行政区的名称,因为region(行政区表)没有上海市的行政区,
但是@first_region_name的值还是上次循环的值。@first_region_name的作用域不会随begin...end结束而消失. 即使循环结束, 依然可以访问@first_region_name。