SQL Server:批处理语句(即使用“go”)有什么好处?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

batch separator.有什么意义?

示例:我经常看到SQL代码中使用它,如下所示,我不明白为什么它会被认为是最佳实践。据我所知,如果没有所有的GO发言:

USE AdventureWorks2012;
GO
BEGIN TRANSACTION;
GO
IF @@TRANCOUNT = 0
BEGIN
    SELECT FirstName, MiddleName 
    FROM Person.Person WHERE LastName = 'Adams';
    ROLLBACK TRANSACTION;
    PRINT N'Rolling back the transaction two times would cause an error.';
END;
ROLLBACK TRANSACTION;
PRINT N'Rolled back the transaction.';
GO

提问于
用户回答回答于

在这个例子中,它是没有任何用处的。

然而,很多语句必须是批处理中的唯一语句。

CREATE PROCEDURE

而且,通常在进行模式更改(例如,向现有表中添加新列)之后,使用新模式的语句必须在不同的批处理中单独编译。

通常情况下,提交独立批次的另一种方法是GO是在子批处理中执行sql。EXEC

用户回答回答于

关于分批分隔符的好特性是:GO您可以将两个SQL查询一起包含在通常会导致错误的同一个脚本中。例如,尝试在同一个脚本文件中删除并重新创建相同的存储过程:

if exists (select * from sys.procedures where name = 'sp_test')
    drop procedure sp_test

create procedure sp_test as
begin
    select 1
end

如果运行上述代码,将得到一个错误:

Msg 156, Level 15, State 1, Procedure sp_test, Line 5 Incorrect syntax near the keyword 'begin'.

而SSM将向您显示错误:

Incorrect syntax. 'CREATE PROCEDURE' must be the only statement in a batch.

使用批处理分隔符可以帮助您避免以下错误:

if exists (select * from sys.procedures where name = 'sp_test')
    drop procedure sp_test
GO
create procedure sp_test as
begin
    select 1
end

如果您想要在源代码管理中使用单个SQL脚本来维护存储过程或函数,这是非常方便的。我们经常使用这种模式。

您可以做的另一件有趣的事情是使用它多次运行查询:

INSERT INTO MyTable (...) ...
GO 10 -- run all the above 10 times!

扫码关注云+社区