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。结果正常了。

posted @ 2025-04-28 18:03  Shapley  阅读(193)  评论(0)    收藏  举报