2012-11-08 68 views
0

在SSMS 2012,設置Options > Query Execution > ANSI > SET IMPLICIT_TRANSACTIONS,比照後this SO postSQL Server Management Studio中的交易和變量

我在查詢窗口下面的代碼:

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

當我選擇了整個街區,並按下Execute ,我看到預期的結果,即1。

但是,當我選擇第4行並執行時,然後選擇第5行,即print @someNumber;,我得到以下消息:

消息137,級別15,狀態2,行1
必須聲明標量變量 「@someNumber」。

變量的範圍究竟是什麼?

我很困惑。有人可以擺脫任何光線,或請指點我正確的方向嗎?

回答

1

一個局部變量的variable is scoped per batch.

範圍是在其中聲明它的批次。

每按一次「執行」是一個批次。因此,對於第二次運行,它沒有宣佈

什麼用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 
+0

感謝您的簡潔的回答和有用的鏈接!我想設置一個變量用於多個批次,並且我想一路查看。我可以更改「執行」的行爲嗎?我需要調試嗎? –

+0

使用臨時表(一行一列)來堅持它 – gbn

+0

謝謝!我最終可能會寫一點.NET存儲過程來實現一個地圖或類似的東西。 –

0

在SSMS中,變量生命的執行期間。

如果您只執行聲明,它會在執行結束時死亡。

如果您然後執行該變量的print語句,它在此執行中沒有聲明,因此它不存在。