Sql server 查询时出现意外错误

Sql server 查询时出现意外错误,sql-server,sql-server-2012,Sql Server,Sql Server 2012,通过SQL Server Management Studio在SQL Server 2012上执行此代码时: PRINT 'Begin'; SELECT 1 A INTO #TEST; DROP TABLE #TEST; SELECT 1 A INTO #TEST; 我得到了错误 数据库中已存在名为“#TEST”的对象 它甚至不打印“开始” 我期望的是代码打印“Begin”,我有一个#TEST表,其中一列名为“a”,一行包含“1”。为什么我的期望是错误的 谢谢 ---更新--- 顺便说一下,

通过SQL Server Management Studio在SQL Server 2012上执行此代码时:

PRINT 'Begin';
SELECT 1 A INTO #TEST;
DROP TABLE #TEST; 
SELECT 1 A INTO #TEST;
我得到了错误

数据库中已存在名为“#TEST”的对象

它甚至不打印“开始”

我期望的是代码打印“Begin”,我有一个#TEST表,其中一列名为“a”,一行包含“1”。为什么我的期望是错误的

谢谢

---更新---

顺便说一下,此代码返回相同的错误消息:

IF OBJECT_ID('tempdb..#TEST') IS NOT NULL DROP TABLE #TEST
GO

PRINT 'Begin';
SELECT 1 A INTO #TEST;
DROP TABLE #TEST; 
SELECT 1 A INTO #TEST;

一旦运行代码,temp表#测试就已经存在。一旦创建,它将一直持续到会话结束。您需要先放下它,然后才能再次运行它

把这个放在最上面,它就会起作用:

IF OBJECT_ID('tempdb..#Test') IS NOT NULL DROP TABLE #TEST
GO
如果这不起作用,那么问题是您使用INTO语句两次。第二次调用导致错误,因为第一次调用之后将存在#test。我想这是一种错误检查SQL的错误。为了避免这种情况,您需要在第二个表中使用不同的临时表名称,或者在DROP表后面加上GO,如下所示

PRINT 'Begin';
SELECT 1 A INTO #TEST;
DROP TABLE #TEST; 
GO
SELECT 1 A INTO #TEST;
或者,您可以先创建表,然后插入到表中,但这样会失去into的性能优势—不确定是否需要这样做。

尝试以下方法:


跌落试验;
打印“开始”;
选择1 A进入#测试;
跌落试验;
选择1 A进入#测试;

这个错误再清楚不过了。已经有一个表
#TEST
。您必须尝试创建表。你甚至没有发布正确的代码。你发布的代码没有问题。你测试过吗?我正在运行2016,并且得到了与此代码相同的错误。没有目标。如果我只运行DROP表,它就不存在。如果我在OP中按原样运行,我会得到同样的错误。你在@Eric处尝试过吗?我不能告诉你为什么,但是在“DROP”行后面加上一个“GO”,它就工作了。如果我能解释原因,我会回答的。我确信这类似于一个“Application.DoEvents()”调用,但既然我不是100%,我就把它作为一个comment@Aaron我猜是因为
GO
命令强制ssms在开始新语句之前将其语句运行到底。因此,sql server有时间删除临时表,该临时表通常保持活动状态,直到另一个会话启动。是否尝试断开会话并重新连接?表上可能有一个锁。这是因为GO发出批处理结束的信号,所以错误检查程序将在GO之后重新启动。阅读更多关于GO的信息,请点击此处: