我什么时候需要使用开始/结束块和SQL Server中的围棋关键字?(When do I need

2019-06-17 14:48发布

谁能告诉我在何时何地,我需要使用beginend块在SQL Server?
此外,究竟什么是Go的关键字吗?

Answer 1:

GO就像一个剧本的结尾。

你可以有多个CREATE TABLE语句,通过GO分离。 这是隔离的另一个脚本的一部分,但其提交的所有在一个块的方式。


BEGIN和END就像{和}在C / ++ /#,Java等

他们结合的代码逻辑块。 我倾向于使用BEGIN和在存储过程的开始和结束END,但它不是绝对必要的存在。 在有必要对循环和IF语句,等等,你需要更多的则一步......

IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
   INSERT INTO Log SELECT @id, 'deleted'
   DELETE my_table WHERE id = @id
END


Answer 2:

您需要BEGIN ... END创建块跨越多个语句。 所以,如果你想要做的两件事情在if语句中的一个“腿”,或者如果你想要做多件事情在while循环的身体,你需要用括号BEGIN那些语句...结束。

该GO关键字并不是SQL的组成部分。 它仅用于查询分析器脚本划分成独立执行的“批次”。



Answer 3:

GO是不是在SQL Server中的关键词; 这是一个批处理分隔符。 GO结束的批处理语句。 当你使用类似SQLCMD这是非常有用的。 想象一下,你正进入命令行的SQL语句。 你不一定想要的东西要在每次您结束发言时间,所以SQL Server会什么,直到你进入“GO”。

同样,您的批处理开始前,你经常需要有一些对象是可见的。 例如,假设您正在创建一个数据库,然后查询它。 你不能写:

CREATE DATABASE foo;
USE foo;
CREATE TABLE bar;

因为富不存在它执行CREATE TABLE批次。 你需要这样做:

CREATE DATABASE foo;
GO
USE foo;
CREATE TABLE bar;


Answer 4:

BEGIN和END是由别人得到了很好的回答。

正如加里指出,GO是一个批处理分隔符,被大多数微软的使用提供的客户端工具,如isql,SQLCMD,查询分析器和SQL Server Management Studio中。 (至少一些工具允许批处理分隔被改变。我从来没有见过的改变批分离器的使用。)

为了回答何时使用GO的问题,人们需要知道什么时候该SQL必须分为批次。

有些语句必须是批处理的第一个语句。

select 1
create procedure #Zero as
    return 0

在SQL Server 2000中错误的是:

Msg 111, Level 15, State 1, Line 3
'CREATE PROCEDURE' must be the first statement in a query batch.
Msg 178, Level 15, State 1, Line 4
A RETURN statement with a return value cannot be used in this context.

在SQL Server 2005中的误差小于有所帮助:

Msg 178, Level 15, State 1, Procedure #Zero, Line 5
A RETURN statement with a return value cannot be used in this context.

因此,使用GO分离是必须从它前面的脚本中的语句一批开始陈述。

当运行一个脚本,很多错误会导致一批停止执行,但随后的客户端将简单地发送下一批,脚本的执行将不会停止。 我经常在测试中使用。 我将开始与开始事务并与回滚结束,做的所有测试中间的脚本:

begin transaction
go
... test code here ...
go
rollback transaction

这样,我总是回到初始状态,即使在测试代码发生错误时,开始和ROLLBACK TRANSACTION语句作为一个单独批次的一部分仍然发生。 如果他们分批不是,那么语法错误会继续从发生开始交易,因为一批被解析为一个单位。 和一个运行时错误将保持回滚的发生。

此外,如果你正在做一个安装脚本,并有几个批次在一个文件中,一个批次的错误不会持续运行,这可能会留下一个烂摊子保持脚本。 (在安装之前,请务必备份。)

相关戴夫·马克尔指出,有些时候,因为SQL Server正在寻找在数据字典对于那些较早的一批创建的对象的解析会失败,但运行任何语句之前可能发生解析案例。 有时候,这是一个问题,有时没有。 我不能拿出一个很好的例子。 但是,如果你得到一个“X不存在”的错误,当它显然将由声明打入批次存在。

而且最后要注意。 事务可以跨批次。 (见上文)。变量不跨批次。

declare @i int
set @i = 0
go
print @i

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@i".


Answer 5:

GO结束批处理,您只需很少需要在代码中使用它。 请注意,如果您在存储过程中使用它时,GO后没有代码会在您执行PROC执行。

BEGIN并且需要用于与代码来处理multipe线任何程序类型语句END。 你需要它们,因为尽管循环和游标(你将避免如果可能的话,当然)和IF语句(以及techincally你不需要他们的IF statment仅具有一行代码,但它更容易维护代码,如果你总是把他们在IF之后)。 CASE语句也使用目的,而是没有一个开头。



Answer 6:

今天这个问题后,摔跤我的观点是这样的:BEGIN ... END括号代码就像{....}确实用C语言,如代码块IF ... ELSE和循环

GO是(必须)使用时,随后的声明依靠由先前的声明中定义的对象。 USE数据库是一个很好的例子上面,但下面还会咬你:

alter table foo add bar varchar(8);
-- if you don't put GO here then the following line will error as it doesn't know what bar is.
update foo set bar = 'bacon';
-- need a GO here to tell the interpreter to execute this statement, otherwise the Parser will lump it together with all successive statements.

在我看来,这个问题是这样的:在SQL Server SQL分析器,不像甲骨文之一,是无法实现的,你在第一行定义一个新的象征,它的确定在以下行参考。 它没有“看”的象征,直到遇到一个GO令牌告诉它执行前面的SQL自上次GO,此时符号应用到数据库中,成为可见的解析器。

为什么它不只是把分号作为语义突破和运用报表中单独我不知道,并希望它。 只有奖金,我可以看到的是,你可以把打印()语句只是在走之前,如果任何语句失败的打印将不会执行。 麻烦很多关于未成年增益虽然。



文章来源: When do I need to use Begin / End Blocks and the Go keyword in SQL Server?