2013-08-19 9 views
27

Mam następujący problem w SQL Server, mam niektóre kodu, który wygląda tak:tabeli tymczasowej w serwerze SQL powodując „Istnieje już obiekt o nazwie” błąd

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

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN FROM TBL_PEOPLE 

Gdy to zrobić otrzymuję error "W bazie danych znajduje się już obiekt o nazwie" #TMPGUARDIAN ". Czy ktoś może mi powiedzieć, dlaczego otrzymuję ten błąd?

Odpowiedz

51

Porzucasz go, a następnie tworzysz, a następnie próbujesz utworzyć ponownie, używając SELECT INTO. Zmień na:

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 

w MS SQL Server można utworzyć tabelę bez CREATE TABLE rachunku za pomocą SELECT INTO

5

Musisz zmodyfikować kwerendę jak ten

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 

- Zrób ostatnią sesję do czyszczenia wszystkich tabel tymczasowych. zawsze upuszczaj na końcu. W twoim przypadku czasami może się zdarzyć błąd, jeśli tabela nie istnieje, podczas próby usunięcia.

DROP TABLE #TMPGUARDIAN 

Unikaj stosowania wkładki do bo jeśli używasz wstawić następnie w przyszłości, jeśli chcesz zmodyfikować tabelę temp dodając nową kolumnę, która może być wypełniona po jakimś sposobem (nie razem z wkładką) . W tym czasie musisz przerobić i zaprojektować go w ten sam sposób.

użytku stołowego Variable http://odetocode.com/articles/365.aspx

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

Zalety Nie potrzeba sprawozdania Drop, ponieważ będzie to podobne do zmiennych. Zakres kończy się natychmiast po wykonaniu.

21

Zwykle umieszczam te linie na początku mojej procedury przechowywanej, a następnie na końcu.

Jest to test "istnieje" dla tabel #temp.

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

W moim przypadku wydaje się, że to za mało. Sam fakt, że jestem napisany dwa razy w tym samym wyborze tego samego "SELECT MyField INTO #TempTable" wystarcza, aby spowodować błąd kompilacji. Wybrane dwie opcje nie mogą zostać trafione w tym samym czasie, ponieważ znajdują się w różnych gałęziach JEŚLI W TEN SPOSÓB: mimo to nie mogę napisać dwa razy tego samego WYBIERZ DO –

+0

Nie używaj Select-Into. To "skrót". Utwórz #tempTable, użyj składni "Wstaw do #MyTemp Wybierz Col1, Col2 z dbo.MyTable". – granadaCoder

3

Czasami można zrobić głupie błędy jak pisanie INSERT na tym samym pliku .sql (w tym samym obszarze roboczym/karcie), więc po wykonaniu zapytania insert gdzie utworzyć zapytanie zostało napisane tuż powyżej i już wykonana , ponownie rozpocznie wykonywanie wraz z zapytaniem o wstawienie.

Jest to powód, dla którego otrzymujemy nazwę obiektu (nazwa tabeli) już istnieje, ponieważ jest on wykonywany po raz drugi.

Przejdź do oddzielnej zakładki, aby napisać wstawkę lub upuść lub inne zapytania, które zamierzasz wykonać.

albo linie użycie komentarz poprzedzające wszystkie zapytania w tej samej przestrzeni roboczej jak

CREATE -- … 
-- Insert query 
INSERT INTO -- … 
0

Podczas gdy PO omawiał tabele jeśli dany obiekt jest procedura przechowywana, upewnij się, że używasz " alter”funkcja:

aLTER PROCEDURA

jeśli wkleić kod, yo może być konieczne zastąpienie "tworzenia" przez "alter" ... stało się to po prostu mnie i jest frustrujące, więc mam nadzieję, że to się stanie komuś innemu.

Powiązane problemy