2012-03-20 54 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.

功能設計,請參見更多信息