2013-08-19 10 views
27

Ich habe das folgende Problem in SQL Server, ich habe einige Code, der wie folgt aussieht:temporäre Tabelle in SQL Server verursachen ‚Es ist bereits ein Objekt mit dem Namen‘ Fehler

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

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN FROM TBL_PEOPLE 

Wenn ich das tue ich eine bekommen Fehler 'Es gibt bereits ein Objekt' #TMPGUARDIAN 'in der Datenbank'. Kann mir jemand sagen, warum ich diesen Fehler bekomme?

Antwort

51

Sie löschen es, erstellen es und versuchen dann, es erneut zu erstellen, indem Sie SELECT INTO verwenden. Wechseln zu:

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 

In MS SQL Server eine Tabelle ohne CREATE TABLE Anweisung erstellen können mit SELECT INTO

5

Sie müssen die Abfrage wie diese ändern

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 

- Machen Sie eine letzte Sitzung um alle temporären Tabellen zu löschen. immer am Ende fallen. In Ihrem Fall kann manchmal ein Fehler auftreten, wenn die Tabelle nicht existiert, während Sie versuchen zu löschen.

DROP TABLE #TMPGUARDIAN 

Vermeiden Einsatz mit in Da Wenn Sie mit INSERT INTO dann in Zukunft, wenn Sie durch das Hinzufügen eine neue Spalte der temporäre Tabelle ändern, die nach einigem Prozess gefüllt werden können (nicht zusammen mit Einsatz) . Zu dieser Zeit müssen Sie es auf die gleiche Weise überarbeiten und gestalten.

Verwenden Table Variable http://odetocode.com/articles/365.aspx

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

Vorteile Keine Notwendigkeit für Aussagen Drop, wird, da dies zu Variablen ähnlich sein. Der Bereich endet unmittelbar nach der Ausführung.

21

Ich normalerweise diese Zeilen am Anfang meiner gespeicherten Prozedur und dann am Ende.

Es ist eine "existiert" Prüfung für #temp Tabellen.

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

In meinem Fall scheint es, es ist nicht genug. Die bloße Tatsache, dass ich zweimal in dasselbe schreibe, wähle dasselbe "SELECT MyField INTO #TempTable" ist genug, um den Kompilierungsfehler zu verursachen. Die zwei select in können nicht gleichzeitig getroffen werden, da sie sich in verschiedenen Zweigen eines IF THEN ELSE befinden: trotzdem kann ich nicht zweimal dasselbe schreiben. SELECT INTO –

+0

Verwenden Sie nicht Select-Into. Es ist ein "Abkürzung". Erstellen Sie die #tempTable, verwenden Sie die Syntax "In # MyTemp Select Col1, Col2 from dbo.MyTable" einfügen. – granadaCoder

3

Manchmal können Sie dumme Fehler machen wie INSERT-Abfrage auf der gleichen SQL-Datei (im selben Arbeitsbereich/tab) Schreiben so, wenn Sie die INSERT-Abfrage ausführen, wo Ihre erstellen Abfrage nur oben und bereits ausgeführt wurde geschrieben Es wird wieder mit der Einfügeabfrage gestartet.

Dies ist der Grund, warum wir den Objektnamen (Tabellenname) bereits erhalten haben, da er zum zweiten Mal ausgeführt wird.

Gehen Sie also zu einer separaten Registerkarte, um die Einfüge- oder Abbruch- oder andere Abfragen zu schreiben, die Sie ausführen möchten.

Oder Linien Gebrauch Kommentar alle Abfragen im selben Arbeitsbereich vorangehenden wie

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

Während die OP-Tabellen besprach, wenn das betreffende Objekt ist eine gespeicherte Prozedur, stellen Sie sicher, dass Sie die " ändern“Funktion:

ALTER VERFAHREN

wenn Sie fügen Code in, yo du musst "create" durch "alter" ersetzen ... das ist mir einfach passiert und ist frustrierend, also hoffe ich, dass es jemand anderem passiert.

Verwandte Themen