2012-03-20 48 views
1

我在删除SQL服务器中的临时表时遇到问题。删除SQL服务器中的临时表?

我有一个存储过程,但是当我通过我的应用程序运行在它说:

“目前已经在数据库中名为‘#WeekList’对象”

当我尝试删除表我得到以下信息:

无法删除表“#WeekList”,因为它不存在或您 没有权限。

我的SP如下:#temp表的

USE [test_staff] 
GO 
/****** Object: StoredProcedure [dbo].[sp_create_week_list] Script Date: 03/20/2012 09:35:42 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 



ALTER PROCEDURE [dbo].[sp_create_week_list] 

AS 

CREATE TABLE #WeekList 
    (
    month_date date 
    ) 


DECLARE @REPORT_DATE DATETIME, @WEEK_BEGINING VARCHAR(10) 
SELECT @REPORT_DATE = '2011-01-19T00:00:00' 
--SELECT @REPORT_DATE = GETDATE() -- should grab the date now. 
SELECT @WEEK_BEGINING = 'MONDAY' 
IF @WEEK_BEGINING = 'MONDAY' 
SET DATEFIRST 1 
ELSE IF @WEEK_BEGINING = 'TUESDAY' 
SET DATEFIRST 2 
ELSE IF @WEEK_BEGINING = 'WEDNESDAY' 
SET DATEFIRST 3 
ELSE IF @WEEK_BEGINING = 'THURSDAY' 
SET DATEFIRST 4 
ELSE IF @WEEK_BEGINING = 'FRIDAY' 
SET DATEFIRST 5 
ELSE IF @WEEK_BEGINING = 'SATURDAY' 
SET DATEFIRST 6 
ELSE IF @WEEK_BEGINING = 'SUNDAY' 
SET DATEFIRST 7 
DECLARE @WEEK_START_DATE DATETIME, @WEEK_END_DATE DATETIME 
--GET THE WEEK START DATE 
SELECT @WEEK_START_DATE = @REPORT_DATE - (DATEPART(DW, @REPORT_DATE) - 1) 
--GET THE WEEK END DATE 
SELECT @WEEK_END_DATE = @REPORT_DATE + (7 - DATEPART(DW, @REPORT_DATE)) 
PRINT 'Week Start: ' + CONVERT(VARCHAR, @WEEK_START_DATE) 
PRINT 'Week End: ' + CONVERT(VARCHAR, @WEEK_END_DATE) 

DECLARE @Interval int = datediff(WEEK,getdate(),@WEEK_START_DATE)+1 

SELECT [email protected]_START_DATE 
, [email protected]_END_DATE 
INTO #WeekList 

WHILE @Interval <= 0 
    BEGIN 
    set @WEEK_START_DATE=DATEADD(WEEK,1,@WEEK_START_DATE) 
    set @WEEK_END_DATE=DATEADD(WEEK,1,@WEEK_END_DATE) 
    INSERT INTO #WeekList values (@WEEK_START_DATE,@WEEK_END_DATE) 
    SET @Interval += 1; 
    END 

SELECT 
CONVERT(VARCHAR(11), Start_Week, 106) AS 'Start', 
CONVERT(VARCHAR(11), End_Week, 106) AS 'End', 
DATEDIFF(DAY, 0, Start_Week)/7 AS week_ref -- create the unique week reference number 

FROM #WeekList 
ORDER BY Start_Week DESC 

DROP TABLE #WeekList 
+0

我surgest你尝试重写该存储过程的链接temporary-table-could-not-be-re-created。我看到很多死代码和循环的可怕方式 – 2012-03-20 12:27:19

回答

5

在SP中,在以下语句中存在问题。

SELECT [email protected]_START_DATE 
, [email protected]_END_DATE 
INTO #WeekList 

而不是那个尝试这个,它可能工作。

INSERT INTO #WeekList 
SELECT [email protected]_START_DATE 
, [email protected]_END_DATE 
+0

提供的值的列名或数量与表定义不匹配。有任何想法吗? – 2012-03-20 10:19:50

+0

声明表语句存在问题。您需要添加如下定义的两列。它会正常工作。 CREATE TABLE #WeekList ( Start_Week date, End_Week date ) – 2012-03-20 10:26:12

+3

+1“问题”的解释:'select ... into'试图创建一个表,但顶部已经有一个'create table'的存储过程。 – Andomar 2012-03-20 12:10:51

1

使用表变量就地它更多更好的选择。 如果你想使用#temp表,然后检查tempdb数据库中是否存在#temp表,那么你可以得到那个#temp表是否存在。

+0

_“这是更好的选择”_你愿意解释吗? – 2012-03-20 10:04:19

+0

我也在DB中创建了一个物理表。 [dbo]。[WeekList]仍然会遇到同样的问题。唯一的区别是我可以放下桌子。 – 2012-03-20 10:05:01

+0

在内存中创建一个表变量,因此执行效率比#temp表稍好一些(同时因为表变量中的锁定和日志记录更少),当过程或函数超出作用域时,表变量会自动清除,所以你不必记得丢弃或清除数据 – KuldipMCA 2012-03-20 10:12:08

1

我能看到的唯一可以暗示有什么问题的地方是缺少BEGIN和END?我用这一切的时候,但我总是把BEGIN和周围的存储过程的代码END ......

2

在代码的中间您有:

select ... 
into #WeekList 

这将尝试创建一个新的临时表所谓#WeekList这你已经创建使用如果你改变插入的风格

insert into #WeekList (columns) 
select ... 

然后,你将摆脱CREATE在PROC

顶部TABLE语句错误

+0

对不起,不完全明白吗?您的意思是:SELECT Start_Week = @ WEEK_START_DATE ,End_Week = @ WEEK_END_DATE INTO #WeekList – 2012-03-20 10:16:37

+1

是的。该语句将尝试创建一个名为#WeekList的新表。另请注意,您的原始#WeekList表定义具有单列,而您随后使用它时需要两列 – kaj 2012-03-20 10:21:37

2

- 检查是否存在

IF OBJECT_ID('tempdb..#temptable') IS NOT NULL 
BEGIN 
drop table #temptable 
END 

,并在使用临时表插入,指定列名外部 像

insert into #temptable(col1,col2..) values(1,2,..) 
+0

已经试过这个,似乎不会掉桌子。 – 2012-03-20 10:21:06

+0

@ SOLDIER-OF-FORTUNE - 更正了脚本。这应该现在工作。如果(OBJECT_ID('tempdb.sys。#YourTable')IS NOT NULL) – 2013-11-16 17:52:54

4

您可以使用此代码删除#YourTable临时表:

if exists (select * from tempdb.sys.tables where name like '#YourTable%') 
    drop table #YourTable 

在您运行insert into创建表格之前,最好做到这一点。

+0

请勿使用此存在(从tempdb.sys.tables中选择*,其中名称像'#YourTable%') 使用保证 – Ive 2016-11-28 16:27:45

0

要检查临时表存在:在您创建了一个临时表#WeekList只有一列其他的答案中提到

IF OBJECT_ID(N'tempdb..#yourTempTableName') IS NOT NULL 
    DROP TABLE #yourTempTableName; 

注意,你再尝试使用重新创建临时表短手SELECT ... INTO #Weeklist;在你选择两列的情况下,这就是问题发生的地方。我会在代码的开头删除CREATE TABLE声明,并使用SELECT ... INTO声明。

0

问题的根本原因是在同一批次中两次创建具有相同名称的临时表。首先通过CREATE TABLE语句,然后通过SELECT .. INTO语句 按照Microsoft BOL,“如果在单个存储过程或批处理中创建多个临时表,则它们必须具有不同的名称。”

这是按澄清对微软连接错误ID 666430.

功能设计,请参见更多信息