簡體   English   中英

刪除SQL Server中的臨時表?

[英]removing a temp table in SQL server?

我在刪除SQL Server中的臨時表時遇到問題。

我有一個存儲過程但是當我通過我的應用程序運行它說:

“數據庫中已經有一個名為'#WeekList'的對象”

當我嘗試刪除表時,我收到以下消息:

無法刪除表'#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

在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

您可以使用以下代碼刪除#YourTable臨時表:

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

在運行insert into以創建表之前,最好的地方就是這樣做。

在您擁有的代碼中間:

select ...  
into #WeekList

這將嘗試創建一個名為#WeekList的新臨時表,您已使用proc頂部的CREATE TABLE語句創建了該臨時表

如果將插入更改為樣式

insert into #WeekList (columns)  
select ...

然后你將擺脫錯誤

- 檢查它是否存在

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

在使用臨時表插入時,請在外部指定列名稱

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

要檢查臨時表是否存在:

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

請注意,在其他答案中提到您創建了一個只有一列的臨時表#WeekList,然后嘗試使用簡寫的SELECT ... INTO #Weeklist重新創建臨時表。 在您的情況下,您正在選擇兩列,這是問題發生的地方。 我將刪除代碼開頭的CREATE TABLE語句,並使用SELECT ... INTO語句。

使用表變量取代#Temp表它是更好的選擇。 如果要使用#temp表,那么檢查Tempdb數據庫中是否存在#temp表,然后就可以得到#temp表了。

我能看到的唯一可以暗示錯誤的是缺少BEGIN和END? 我一直都在使用它,但是我總是將bEGIN和END放在sprocs代碼周圍......

問題的根本原因是在同一批次中創建了兩次具有相同名稱的臨時表。 首先是CREATE TABLE語句,第二個是SELECT .. INTO語句根據Microsoft BOL,“如果在單個存儲過程或批處理中創建了多個臨時表,它們必須具有不同的名稱。”

根據Microsoft Connect Bug ID 666430的說明,這是一項設計功能。

請參閱鏈接臨時表 - 無法重新創建以獲取更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM