查询时出现意外错误

时间:2018-02-16 16:20:09

标签: 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'在数据库中。

它甚至不打印'开始'

我期待的是代码打印'开始'我有一个#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;

2 个答案:

答案 0 :(得分:2)

一旦临时表#TEST已经存在,就运行代码。一旦创建,它将持续到您的会话结束。在再次运行它之前,您需要先删除它。

将它置于顶部,它将起作用:

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;

或者你可以先创建表然后插入它们但是你会失去性能优势 - 不确定是否需要。

答案 1 :(得分:0)

试试这个:

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