удалить временную таблицу в SQL-сервере? - PullRequest
2 голосов
/ 20 марта 2012

У меня проблемы с удалением временной таблицы на сервере SQL.

У меня есть хранимая процедура, но когда я запускаю ее через приложение, оно говорит:

"В базе данных уже есть объект с именем #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

Ответы [ 8 ]

5 голосов
/ 20 марта 2012

В 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
4 голосов
/ 20 марта 2012

Вы можете удалить временную таблицу #YourTable, используя этот код:

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

Лучшее место для этого - прямо перед запуском insert into для создания таблицы.

2 голосов
/ 20 марта 2012

- Проверьте, существует ли он

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

и при использовании временной вставки таблицы укажите внешние имена столбцов, например

insert into #temptable(col1,col2..) values(1,2,..)
2 голосов
/ 20 марта 2012

В середине кода у вас есть:

select ...  
into #WeekList

Это попытается создать новую временную таблицу с именем #WeekList, которую вы уже создали, используя инструкцию CREATE TABLE в верхней части процедуры

Если вы измените вставку на стиль

insert into #WeekList (columns)  
select ...

Тогда вы избавитесь от ошибки

1 голос
/ 15 августа 2013

Чтобы проверить, существует ли временная таблица:

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

Обратите внимание, что, как упоминалось в других ответах, вы создали временную таблицу #WeekList только с одним столбцом, затем вы пытаетесь воссоздать временную таблицу, используя сокращенную комбинацию SELECT ... INTO #Weeklist; который в вашем случае вы выбираете два столбца, это где проблема возникает. Я удалил бы оператор CREATE TABLE в начале вашего кода и просто использовал бы оператор SELECT ... INTO.

1 голос
/ 20 марта 2012

Единственное, что я могу увидеть, что может намекнуть на то, что не так, это отсутствие BEGIN и END? Я использую это все время, но я всегда помещаю BEGIN и END вокруг кода sprocs ...

1 голос
/ 20 марта 2012

Используйте табличную переменную вместо таблицы #Temp, это более лучший вариант. Если вы хотите использовать таблицу #temp, то проверьте наличие таблицы #temp в базе данных Tempdb, тогда вы можете получить, существует ли эта таблица #temp или нет.

0 голосов
/ 26 января 2014

Основная причина проблемы заключается в том, что временная таблица с одним и тем же именем создается два раза в одном пакете.Сначала оператором CREATE TABLE, а затем оператором SELECT .. INTO. Согласно Microsoft BOL: «Если в одной хранимой процедуре или пакете создано более одной временной таблицы, они должны иметь разные имена».

Это особенность, разработанная в соответствии с пояснениями к идентификатору ошибки Microsoft Connect 666430.

См. Ссылку временная таблица не может быть воссоздана для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...