2011-06-10 58 views
2

我想深究其中,因爲它讓我感到困惑。任何人都可以解釋什麼時候我應該在我的腳本中使用GO語句?與GO聲明混淆,未提交的交易和更改過程

據我所知,GO語句不是T-SQL語言的一部分,而是用來發送一批語句到SQL服務器進行處理。

當我在查詢分析器中運行下面的腳本它看起來運行良好。然後關閉窗口並顯示警告:

「有未提交的事務,您希望在關閉窗口之前提交這些事務嗎?」

BEGIN TRANSACTION; 
GO 

ALTER PROCEDURE [dbo].[pvd_sp_job_xxx] 
    @jobNum varchar(255) 

AS 
BEGIN 

    SET NOCOUNT ON; 
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job; 
END 


COMMIT TRANSACTION; 
GO 

但是,如果我在ALTER語句的末尾添加一個GO,那麼它就可以(如下所示)。怎麼來的?

BEGIN TRANSACTION; 
GO 



ALTER PROCEDURE [dbo].[pvd_sp_xxx] 
    @jobNum varchar(255) 

AS 
BEGIN 

    SET NOCOUNT ON; 
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job; 
END 
GO 


COMMIT TRANSACTION; 
GO 

我想過移除所有的GO的,但隨後抱怨說,ALTER PROCEDURE語句必須是查詢批處理中的第一條語句?這只是我必須堅持的要求嗎?

它似乎很奇怪,因爲如果我BEGIN TRANSACTION和GO ....該語句被髮送到服務器進行處理,我開始一個事務。

接下來是ALTER過程,一個COMMIT TRANSACTION和一個GO(因此將這些語句發送到服務器進行處理,提交以完成之前啓動的事務),當我關閉窗口時仍然抱怨?當然,我確信alter procedure statement是批處理中的第一個。它如何抱怨未提交的交易。

任何幫助將不勝感激!

回答

5

在你的第一個腳本,凱明是存儲過程的一部分......

在存儲過程BEGIN和END 定義範圍(啓動+存儲的過程體的顏色):在批量做,這是下一個GO(或腳本結束)

因此,改變間距和添加註釋

BEGIN TRANSACTION; 
GO 
--start of batch. This comment is part of the stored proc too 
ALTER PROCEDURE [dbo].[pvd_sp_job_xxx] 
    @jobNum varchar(255) 
AS 
BEGIN --not needed 
    SET NOCOUNT ON; 
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job; 
END --not needed 
--still in the stored proc 
COMMIT TRANSACTION; 
GO--end of batch and stored procedure 

要檢查,運行

SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.pvd_sp_job_xxx')) 
+0

感謝,似乎有道理。 – bobbo 2011-06-10 15:08:09

+0

第一條語句BEGIN TRANSACTION之後的GO也顯得多餘。 – bobbo 2011-06-10 15:08:59

+0

另外,正如你所提到的那樣,BEGIN和END並沒有在存儲過程中定義範圍,這個批處理就是這樣。所以我肯定需要在CREATE PROCEDURE結束時使用GO。那麼,BEGIN和END有什麼意義呢? – bobbo 2011-06-10 15:10:28

0

儘管這是一箇舊帖子,但是在編譯我的一個程序而沒有任何開始事務,提交事務或GO之後,仍然存在這個問題。程序可以被調用併產生預期的結果。 我正在使用SQL Server 2012.它是否做出了一些改變

我知道這是爲了答案。但是評論部分中的話太小了。