Временна таблица в SQL сървър, причиняваща грешка „Вече има обект с име“.

Имам следния проблем в SQL Server, имам някакъв код, който изглежда така:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

Когато правя това, получавам грешка „В базата данни вече има обект с име „#TMPGUARDIAN“. Може ли някой да ми каже защо получавам тази грешка?


person Art F    schedule 19.08.2013    source източник


Отговори (5)


Изпускате го, след това го създавате, след което се опитвате да го създадете отново с помощта на SELECT INTO. Промени на:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN 
SELECT LAST_NAME,FRST_NAME  
FROM TBL_PEOPLE

В MS SQL Server можете да създадете таблица без оператор CREATE TABLE, като използвате SELECT INTO

person Hart CO    schedule 19.08.2013

Обикновено поставям тези редове в началото на моята съхранена процедура и след това в края.

Това е проверка за съществуване за #temp таблици.

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end

Пълен пример:

CREATE PROCEDURE [dbo].[uspTempTableSuperSafeExample]
AS
BEGIN
    SET NOCOUNT ON;


    IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
    BEGIN
            DROP TABLE #MyCoolTempTable
    END


    CREATE TABLE #MyCoolTempTable (
        MyCoolTempTableKey INT IDENTITY(1,1),
        MyValue VARCHAR(128)
    )  

    INSERT INTO #MyCoolTempTable (MyValue)
        SELECT LEFT(@@VERSION, 128)
        UNION ALL SELECT TOP 10 LEFT(name, 128) from sysobjects

    SELECT MyCoolTempTableKey, MyValue FROM #MyCoolTempTable


    IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
    BEGIN
            DROP TABLE #MyCoolTempTable
    END


    SET NOCOUNT OFF;
END
GO
person granadaCoder    schedule 19.08.2013
comment
В моя случай изглежда, че не е достатъчно. Самият факт, че пиша два пъти в едно и също изберете едно и също SELECT MyField INTO #TempTable, е достатъчен, за да причини грешка при компилиране. Двата select into не могат да бъдат ударени едновременно, защото са в различни клонове на IF THEN ELSE: въпреки това не мога да напиша два пъти едно и също SELECT INTO - person Johannes Wentu; 03.02.2016
comment
Не използвайте Select-Into. Това е пряк път. Създайте #tempTable, използвайте синтаксиса Insert Into #MyTemp Select Col1, Col2 от dbo.MyTable. - person granadaCoder; 14.03.2016
comment
IF OBJECT_ID('tempdb..#TMPGUARDIAN') IS NOT NULL start drop table #TMPGUARDIAN end Изберете LAST_NAME,FRST_NAME INTO #TMPGUARDIAN от TBL_PEOPLE SELECT * FROM #TMPGUARDIAN - person AMRESH PANDEY; 07.04.2018
comment
Amresh, това не работи в този случай - както е отбелязано другаде, дори когато select-in е във взаимно изключващи се клонове, самият факт, че има два от тях в една и съща временна таблица, ще причини грешка на компилатора. Явно е недостатък в лексикора. - person RBerman; 16.04.2019

Трябва да промените заявката по този начин

CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME)
SELECT LAST_NAME,FRST_NAME  FROM TBL_PEOPLE

-- Направете последна сесия за изчистване на всички временни таблици. винаги пада в края. Във вашия случай понякога може да възникне грешка, ако таблицата не съществува, докато се опитвате да изтриете.

DROP TABLE #TMPGUARDIAN

Избягвайте използването на вмъкване в Защото, ако използвате вмъкване в, тогава в бъдеще, ако искате да промените временната таблица, като добавите нова колона, която може да бъде попълнена след някакъв процес (не заедно с вмъкване). По това време трябва да го преработите и проектирате по същия начин.

Използвайте таблична променлива http://odetocode.com/articles/365.aspx

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)

Предимства Няма нужда от оператори Drop, тъй като това ще бъде подобно на променливите. Обхватът приключва веднага след изпълнението.

person kbvishnu    schedule 19.08.2013

Понякога може да направите глупави грешки като писане на заявка за вмъкване в същия .sql файл (в същото работно пространство/раздел), така че след като изпълните заявката за вмъкване, където вашата заявка за създаване е написана точно по-горе и вече е изпълнена, тя отново ще започне да се изпълнява заедно със заявката за вмъкване.

Това е причината, поради която получаваме, че името на обекта (име на таблица) вече съществува, тъй като се изпълнява за втори път.

Така че отидете в отделен раздел, за да напишете вмъкването или пускането или каквито и да било заявки, които се каните да изпълните.

Или използвайте редове за коментари пред всички заявки в едно и също работно пространство като

CREATE -- …
-- Insert query
INSERT INTO -- …
person Kalaivani Mathivanan    schedule 22.12.2014

В Azure Data warehouse също това се случва понякога, тъй като временни таблици, създадени за потребителска сесия.. Получих същия проблем отстранен чрез повторно свързване на базата данни,

person dgcharitha    schedule 15.01.2019
comment
Това го поправи, защото прекъсването на връзката изтри временната таблица. Това няма нищо общо с първоначалния въпрос. - person RBerman; 16.04.2019