Sql Server变量声明及使用技巧
1.变量声明
变量声明declare @var 其作用域为当前所在的批处理。
1.如果当前语句中有go语句,则在go语句处截止,否则在当前整体代码都有效。
例如:
IF 1=1 BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END PRINT 'out if:'+@test
不报错,如果在最后的print前加入go语句,
IF 1=1 BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END go PRINT 'out if:'+@test
则输出:
in if:1 消息 137,级别 15,状态 2,第 8 行 必须声明标量变量 "@test"。
若改掉条件:
IF 1=2 BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END PRINT 'out if:'+@test
则也不报错,充分说明,无论if条件是否命中,则其中的declare都会被执行。
若声明时默认赋值呢:
IF 1=2 BEGIN DECLARE @test VARCHAR='ffff' SET @test='1' PRINT 'in if:'+@test END PRINT 'out if:'+@test
也输出为空,说明,声明和赋值是分开的,赋值必须要符合条件才行,而声明则无论在什么地方,都及时生效。
以上参考:SQL中的declare用法
2.循环情况:可以在循环过程中声明并用select语句对变量进行赋值(等同于外部声明+内部set null+select赋值)
CREATE TABLE #a(id int) INSERT INTO #a VALUES(1); DECLARE @index INT =1,@maxindex int=2; WHILE(@index<=@maxindex)BEGIN DECLARE @rootid INT=(SELECT id FROM #a WHERE id=@index); PRINT(@rootid) SET @index=@index+1; END;
运行上述代码,只输出一次结果1,正常。如果将declare拿出来进行声明,则要注意select为空的情况,即:select结果为空时变量还会携带上次的赋值结果(这一点要特别当心)
DECLARE @rootid INT; DECLARE @index INT =1,@maxindex int=2; WHILE(@index<=@maxindex)BEGIN SELECT @index=id FROM #a WHERE id=@index); PRINT(@rootid) SET @index=@index+1; END;
则会输出2次1,最后一次虽然没有赋值成功,但是@index会留存上一次的结果,这一点要特别注意。针对这种情况,用set语句进行纠正即可,如下所示:
DECLARE @rootid INT; DECLARE @index INT =1,@maxindex int=2; WHILE(@index<=@maxindex)BEGIN set @rootid=(SELECT id FROM #a WHERE id=@index); PRINT(@rootid) SET @index=@index+1; END;
运行代码,则只输出一次1。结果正常了。
浙公网安备 33010602011771号