0

在 SSMS 2012 中,设置后Options > Query Execution > ANSI > SET IMPLICIT_TRANSACTIONS,请参阅此 SO 帖子

我在查询窗口中有以下代码:

begin transaction 
    select @@TRANCOUNT
    begin
    declare @someNumber int; set @someNumber = 1; 
    print @someNumber;
    end
rollback 

当我选择整个块并按Execute时,我看到了预期的结果,即 1。

但是,当我选择前 4 行并执行时,然后选择第 5 行,即print @someNumber;,我收到以下消息:

Msg 137, Level 15, State 2, Line 1
必须声明标量变量“@someNumber”。

变量的范围究竟是什么?

我很困惑。有人可以阐明或指出我正确的方向吗?

4

2 回答 2

1

变量的范围是每批

局部变量的范围是声明它的批次。

“执行”的每一次按下都是一个批次。所以,对于第二次运行,它没有被声明

2次运行在做什么是这样的

--start of batch 1
    begin transaction 
        select @@TRANCOUNT
        begin
        declare @someNumber int; set @someNumber = 1; 
--end of batch 1
        GO --separate batch after this
--start of batch 2
        print @someNumber;
        end
    rollback
--end of batch 2
于 2012-11-08T14:01:47.390 回答
0

在 SSMS 中,变量在执行期间存在。

如果你只执行声明,它会在执行结束时死掉。

如果您随后执行变量的 print 语句,则它没有在此执行中声明,因此它不存在。

于 2012-11-08T14:03:07.970 回答