删除SQL Server中的临时表?

时间:2012-03-20 09:59:38

标签: sql sql-server sql-server-2008 tsql temp-tables

我在删除SQL Server中的临时表时遇到问题。

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

  

"已经有一个名为'#WeekList'的对象在数据库"

当我尝试删除表时,我收到以下消息:

  

不能删除表格#Week;'#WeekList',因为它不存在或您没有   没有许可。

我的SP如下:

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 Start_Week=@WEEK_START_DATE
, End_Week=@WEEK_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

8 个答案:

答案 0 :(得分:5)

在SP中,以下声明存在问题。

SELECT Start_Week=@WEEK_START_DATE
, End_Week=@WEEK_END_DATE
INTO #WeekList

而不是尝试这个,它可能会起作用。

INSERT INTO #WeekList
SELECT Start_Week=@WEEK_START_DATE
, End_Week=@WEEK_END_DATE

答案 1 :(得分:4)

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

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

在运行insert into创建表格之前,最好的地方就是这样做。

答案 2 :(得分:2)

在您拥有的代码中间:

select ...  
into #WeekList

这将尝试创建一个名为#WeekList的新临时表,您已使用proc顶部的CREATE TABLE语句创建了该表

如果将插入更改为样式

insert into #WeekList (columns)  
select ...

然后你将摆脱错误

答案 3 :(得分:2)

- 检查它是否存在

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

在使用临时表插入时,请在外部指定列名 喜欢

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

答案 4 :(得分:1)

使用表变量代替#Temp表,这是更好的选择。 如果你想使用#temp表,那么检查Tempdb数据库中是否存在#temp表,那么你就可以得到#temp表。

答案 5 :(得分:1)

我能看到的唯一可以暗示错误的是缺少BEGIN和END?我一直都在使用它,但是我总是将BEGIN和END放在sprocs代码周围......

答案 6 :(得分:1)

检查临时表是否存在:

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

请注意,在其他答案中提到您创建了一个只有一列的临时表#WeekList,然后尝试使用简写SELECT ... INTO #Weeklist重新创建临时表;在您的情况下,您正在选择两列,这是问题发生的地方。我会删除代码开头的CREATE TABLE语句,只使用SELECT ... INTO语句。

答案 7 :(得分:0)

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

根据Microsoft Connect Bug ID 666430的说明,这是一项设计功能。

有关详细信息,请参阅链接temporary-table-could-not-be-re-created