";" 和有啥不一样和 T-SQL 中的“GO”?

Posted

技术标签:

【中文标题】";" 和有啥不一样和 T-SQL 中的“GO”?【英文标题】:What is the difference between ";" and "GO" in T-SQL?";" 和有什么不一样和 T-SQL 中的“GO”? 【发布时间】:2009-10-04 22:14:45 【问题描述】:

我使用 ADO.NET 和 sqlcmd 实用程序将 SQL 脚本发送到 SQL Server 2008。使用 ;GO 分隔 SQL 块有什么区别?

【问题讨论】:

【参考方案1】:

GO 实际上不是 T-SQL 命令。 GO 命令是由 Microsoft 工具引入的,用于分隔批处理语句,例如存储过程的结尾。 GO 受 Microsoft SQL 堆栈工具支持,但不是其他工具的正式组成部分。

您不能将GO 放入SQL 字符串中并将其作为ADO.NET 命令对象的一部分发送,因为SQL 本身不理解该术语。另一种证明这一点的方法是使用分析器:在 Query Analyzer/Management Studio 中设置一些使用GO 的语句,然后在执行时运行分析器。您将看到它们作为单独的命令发送到服务器。

分号用于表示语句本身的结束,不一定是整批。

http://msdn.microsoft.com/en-us/library/ms188037.aspx

【讨论】:

我开始了一个连接尝试让 GO 成为一个有效的 t-sql 命令:connect.microsoft.com/SQLServer/feedback/details/3138257/… 那么我们应该如何知道我们的 SQL 脚本中的哪些语句是 SQL 语句并且需要分号,而我们的 SQL 脚本中的哪些语句不是 SQL 语句而不需要呢? @EdElliott 建议的新位置:feedback.azure.com/forums/908035-sql-server/suggestions/… 传奇!前几天我在找那个。【参考方案2】:

"GO" 类似于 ;在许多情况下,但实际上确实意味着批次的结束。

每个批次都在调用“GO”语句时提交,所以如果你有:

SELECT * FROM table-that-does-not-exist;
SELECT * FROM good-table;

在您的批处理中,将永远不会调用好表选择,因为第一次选择会导致错误。

如果你有:

SELECT * FROM table-that-does-not-exist
GO
SELECT * FROM good-table
GO

第一个select语句仍然会出错,但是由于第二个语句在自己的批处理中,它仍然会执行。

GO 与提交事务无关。

【讨论】:

【参考方案3】:

分号是语句分隔符。遇到分号时不一定要执行前面的语句。

GO

表示一个批次的结束。执行上一批语句,遇到块尾也是如此。

GO 2

意味着多次执行批处理。我想我一生中可能两次使用过这个选项。再说一次,我不是行业的 DBA。

【讨论】:

【参考方案4】:

    在 SQL Server TSQL (2005 - 2016) 下,请记住:

    分号 (;) 是 终止符。 GO 是一个 batch 终结者。

    此外,GO 可用于使用以下语法多次调用同一个 DML 块:

去[计数]

其中 [count] 是一个正整数,表示在所述 GO 之前的 TSQL 命令块要反复执行多少次。

    此外,与分号不同,GO 在新 DDL 之前是强制的,例如,当您创建新视图时,因为用分号分隔先前命令会触发错误。例如:

删除视图#temporary_view开始 创建视图#another_view... --> 没有错误

如果您在前面的示例中将 GO 替换为分号,则会引发以下错误消息:

'CREATE VIEW' 必须是查询批处理中的第一条语句。

【讨论】:

最完整的答案。尤其是(3),如果被忽视,肯定会导致脚本失败。【参考方案5】:

'GO' 通常用于表示 batch SQL 语句的结束,这意味着您可以将 begin transactionend transaction 包装成单个语句集合,这些语句可以一起失败或成功。

';'通常用于分隔多个 SQL 语句。这在需要返回多个记录集的 SQL 脚本中很明显,例如 `select * from table1;从表 2 中选择 *;'这将在客户端产生两个单独的记录集。

【讨论】:

【参考方案6】:

命令 GO 表示批处理的结束。 因此,在 GO 之前声明的所有变量在 GO 命令之后都是无效的。 反对分号不会结束批处理。

如果您将在过程中使用 DML 命令,请使用分号代替 GO。 例如:

CREATE PROCEDURE SpMyProc
@myProcParam VARCHAR(20)
AS
DECLARE @myOtherParam INT = 5
;DISABLE TRIGGER ALL ON tMyTable
UPDATE tMyTable SET myVar = @myProcParam, mySecondVar = @myOtherParam
;ENABLE TRIGGER OLL ON tMyTable 

【讨论】:

【参考方案7】:

我以为 ;字符分隔 SQL 命令列表,GO 只是指示 SQL Server 提交所有先前的命令。

【讨论】:

以上是关于";" 和有啥不一样和 T-SQL 中的“GO”?的主要内容,如果未能解决你的问题,请参考以下文章

union 和 join 和有啥不一样?

union 和 join 和有啥不一样?

infura 和 geth 和有啥不一样?

nx 和 Lerna 和有啥不一样? (monorepos)

agora 和 mux 和有啥不一样?在颤动中流式传输实时视频的最佳方式是啥?

vector stack(堆栈)有啥不一样和一样的地方?