(4.29)sql server中有关于GO的坑
本问题基于上海sql server dba技术群提问分析总结而成:
群友问题:
就是一台服务器有数据库A,但没有数据库B(A和B有相同得表),我把B数据库的建表语句执行了在use A环境下了,为什么A数据库会被修改呢?
建表语句如下:
过程分析:
【1】首先,之前在运行脚本的时候,数据库选择的肯定是use A
【2】 然后当use b的时候,会报错,因为有GO做提交,GO与GO之间的文本互不影响,所以图中的use B会报错找不到数据库,但是随后接了GO
【3】 所以并没有切换到B(仍在use A环境下运行),又因为有GO,所以MSSQL会忽略use B该报错(只会回滚本条信息),继续运行文本后续内容。
模拟测试:
所以当test1不存在时,后续的select 3依然运行再test库环境下!
原理演示剖析:
【1】 当没有GO的时候
结果: 如果某一行报错,那么该行及该后面所有语句都不会执行了
【2】当有GO的时候
结果: 加了GO之后,即使中间行报错,后面的行还是会执行