SQL语句如何在带有GO和没有GO语句的SQL Server Management Studio中执行?

Noo*_*uvo 8 t-sql sql-server ssms

我有一个简单的查询

CREATE TABLE #tempTable (id int)
DROP TABLE #tempTable

CREATE TABLE #tempTable (id int)
DROP TABLE #tempTable
Run Code Online (Sandbox Code Playgroud)

从我的理解,在第二部分,它应该创造#tempTable.

但它显示以下错误

消息2714,级别16,状态1,行4
数据库中已存在名为"#tempTable"的对象.

我搜索了原因并发现它是由于GO查询的两个部分之间的声明.因此,正确的查询是

CREATE TABLE #tempTable (id int)
DROP TABLE #tempTable
GO    

CREATE TABLE #tempTable (id int)
DROP TABLE #tempTable
Run Code Online (Sandbox Code Playgroud)

我还发现GO只是告诉SSMS GO按顺序在各个批次之间发送SQL语句.

我的问题是,SQL语句是如何执行的?它不是按顺序执行的吗?

如果它按顺序执行,那么为什么我的第一个查询会导致错误?

Gor*_*off 6

SQL Server 文档很好地解释了这一点.

在您的特定情况下,问题是编译时错误与执行时错误.

这是如何运作的?没有GO分隔语句,所有语句都是同时编译的.问题是第三个语句是一个CREATE TABLE语句,表已经存在.所有发生的事情是语句被解析和编译.

使用GO,编译并执行前两个语句.瞧!CREATE第三个陈述中没有表格.