本问题基于上海sql server dba技术群提问分析总结而成:

群友问题:  

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  就是一台服务器有数据库A,但没有数据库B(A和B有相同得表),我把B数据库的建表语句执行了在use A环境下了,为什么A数据库会被修改呢?

 

建表语句如下:

  (4.29)sql server中有关于GO的坑 随笔 第1张

 

过程分析:

  【1】首先,之前在运行脚本的时候,数据库选择的肯定是use A

  【2】 然后当use b的时候,会报错,因为有GO做提交,GO与GO之间的文本互不影响,所以图中的use B会报错找不到数据库,但是随后接了GO

  【3】 所以并没有切换到B(仍在use A环境下运行),又因为有GO,所以MSSQL会忽略use B该报错(只会回滚本条信息),继续运行文本后续内容。 

 

模拟测试:

  所以当test1不存在时,后续的select 3依然运行再test库环境下!

  (4.29)sql server中有关于GO的坑 随笔 第2张

 

 

 

原理演示剖析:

【1】 当没有GO的时候

  (4.29)sql server中有关于GO的坑 随笔 第3张  (4.29)sql server中有关于GO的坑 随笔 第4张

  结果: 如果某一行报错,那么该行及该后面所有语句都不会执行了

    (4.29)sql server中有关于GO的坑 随笔 第5张

 

 

   

 【2】当有GO的时候

   (4.29)sql server中有关于GO的坑 随笔 第6张 (4.29)sql server中有关于GO的坑 随笔 第7张

 

 

   结果: 加了GO之后,即使中间行报错,后面的行还是会执行 

    (4.29)sql server中有关于GO的坑 随笔 第8张

 

 

    

 

  

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄