2011-03-27 20 views
4

我没有什么用TSQL和SQL Server没有经验 - 所以MySQL时我想执行语句,我只是写:为了执行SQL服务器语句,我是否必须编写“GO”字?

Select * from users 

...然后按回车。

但是现在我看到很多SQL Server教程,每个语句后都有GO字。我必须写这个吗?例如:

Select * from users; GO 

或者,我可以简单的写:

Select * from users; <enter key pressed...> 

回答

7

在SQL Server中,go分离查询批次。在大多数情况下它是可选的。

在早期版本的SQL Server,你必须做一个go变更表,如后:

alter table MyTable add MyColumn int 
go 
select MyColumn from MyTable 

如果没有,则SQL Server将解析查询批处理,并抱怨说MyColumn没不存在。见MSDN

SQL Server实用解释GO作为 信号,他们应该在 当前批的Transact-SQL语句 的发送到SQL Server实例。目前一批 报表是由自上次GO, 或自专案 会话或脚本的开始,如果这是第一次 GO输入的所有 语句。

+0

10倍...有趣。 – leo 2011-03-27 16:57:14

+0

而不是输入,你可以按F5来执行查询 – BlackTigerX 2011-03-27 18:30:47

+0

@leo:还有一件事,虽然你会在Andomar链接的页面上找到它,但应该清楚地说明:'GO不是Transact-SQL语句;它是由sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器识别的命令。即,请记住不要在客户端的查询中使用它,因为引擎不会识别它,但会引发语法错误。 – 2011-03-27 18:46:13

0

您不需要。 GO将执行每条语句(至少在Sql Server中)

1

Go是可选的,不需要在sql语句中写入它。

0

正如其他答复者在我之前所说,你并不需要Go

只有一种情况需要使用它,那就是当你想创建一个表或视图,然后从中选择。

例如:

create view MyView as select * from MyTable 
go 
select * from MyView 

没有Go,因为select语句不是有效的SQL Server将不执行这一点,因为视图不会在那一刻存在。

+0

不正确。因为它表示CREATE语句的结尾,所以需要“GO”的原因。由于SQL Server 2005中存在语句级编译,如果对象当前不存在,编译会延迟。 – 2011-03-27 19:05:03

+0

是的,这是真的。我只是在SQL Server 2008 R2上试了一下 - 没有运行,查询无法运行。 – 2011-03-27 21:08:19

+1

我知道它没有运行。但不是因为你的建议。 'exec('创建视图MyView作为select * from MyTable');选择*从MyView'工作正常。如果将鼠标悬停在SSMS中的红色波浪线上,您将看到实际的投诉是“CREATE VIEW必须是批处理中的唯一声明”。还可以尝试'create table mytable(c int);选择* from mytable' – 2011-03-27 21:11:08

2

GO分离批次,正如Andomar写的。

某些SQL语句(例如CREATE SCHEMA)需要是批次中的第一个或唯一的语句。例如,MSDN状态

CREATE PROCEDURE语句不能 可以在单一批次其它Transact-SQL语句 结合。

局部变量也限制为一个批次,因此在GO之后无法访问。

相关问题