与GO语句,未提交的事务和更改过程混淆

bob*_*bbo 2 sql sql-server-2005 sql-server-2008

我想深究这一点,因为这让我感到困惑.任何人都可以解释我何时应该在我的脚本中使用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
Run Code Online (Sandbox Code Playgroud)

但是,如果我在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
Run Code Online (Sandbox Code Playgroud)

我想删除所有的GO,但是它抱怨alter procedure语句必须是查询批处理中的第一个语句?这只是我必须坚持的要求吗?

这看起来很奇怪,因为如果我BEGIN TRANSACTION和GO ....该语句被发送到服务器进行处理并开始一个事务.

接下来是ALTER过程,一个COMMIT TRANSACTION和一个GO(因此将这些语句发送到服务器进行处理,提交完成之前开始的事务),当我关闭窗口时它是怎么回事?当然,我已经满意alter procedure语句是批处理中的第一个.怎么抱怨未提交的交易.

任何帮助将非常感谢!

gbn*_*gbn 5

在您的第一个脚本中,COMMIT是存储过程的一部分......

存储过程中的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
Run Code Online (Sandbox Code Playgroud)

检查,运行

SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.pvd_sp_job_xxx'))
Run Code Online (Sandbox Code Playgroud)