";" 和有啥不一样和 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 transaction
和 end 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”?的主要内容,如果未能解决你的问题,请参考以下文章
nx 和 Lerna 和有啥不一样? (monorepos)