Go语句的作用是表示一个batch(多条Tsql命令)的结束,并向sql server 提交batch,由于局部变量的作用域是基于batch的,所以,go语句限制局部变量的作用域在一个batch中。
GO 不是Transact-SQL 语句。Go语句通知Microsoft SQL Server实用工具一批Transact-SQL 语句的结束。
在TSQL 脚本中,有时需要将整个脚本分为多个batch,单独发送到sql server去执行。在同一个session中的多个batch是有顺序的,只有当前一个batch执行完成,才能执行下个batch。
一些语句要求有单独的批处理的语句:
1. Create Default
2. Create Procedure
3. Create Rule
4. Create Trigger
5. Create View
注:如果想在单独的脚本中将这些语句组合,则需要通过使用GO语句来将它们分散到各自的批处理中。
1,Go语句限制局部变量的作用域在一个batch中
declare @i int set @i=1 select @i as i go --raise error, exceed variable scope select @i as i
消息 137,级别 15,状态 2,第 2 行
必须声明标量变量 "@i"。
变量@i的作用域在go执行时,就结束了,sql server抛出错误信息,变量@i没有定义
2,SQL Server 将多个 Transact-SQL 语句作为一个批发送到 SQL Server 执行,该批中的语句被编译成一个执行计划,sql server utility 使用 GO 作为批结束的信号。
3,使用 GO [N] 重复执行batch N次
N 为正整数,指定GO 之前的批处理执行指定的次数。
select 1 as i go 10
4, 调用Exec命令的Tsql 脚本和Exec执行的Tsql命令不在同一个batch中,由于局部变量是基于batch的,所以调用Exec命令的Tsql脚本不能使用exec执行的Tsql命令中的局部变量,而exec执行的sql命令也不能使用调用方的局部变量。
Exec和调用它的代码都在单独的作用域下运行,也就是说,调用代码不能引用EXEC语句中的变量,并且在调用代码中的变量被解析为用于EXEC语句的字符串之后,EXEC执行的Tsql命令不能引用这些变量。如果需要在动态SQL和调用它的例程间传递值,考虑使用存储过程 sys.sp_executesql。
5,使用批处理建立优先级
在TSQL 脚本中,有时需要将整个脚本分为多个batch,单独发送到sql server去执行。在同一个session中的多个batch是有顺序的,只有当前一个batch执行完成,才能执行下个batch。
CREATE DATABASE db_test GO USE db_test go CREATE TABLE dbo.dt_test ( col1 INT, col2 INT )
参考文档:
https://msdn.microsoft.com/zh-cn/library/ms188037.aspx
http://blog.csdn.net/tjvictor/article/details/5454669
原文:http://www.cnblogs.com/ljhdo/p/4984644.html