通过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;
答案 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;