2008-09-05 17 views
0

Warum können Sie das nicht tun und gibt es Arbeit?SQL Server 2005 Fehler

Sie erhalten diesen Fehler.

Msg 2714, Ebene 16, Status 1, Zeile 13 In der Datenbank befindet sich bereits ein Objekt mit dem Namen "#temptable".

declare @x int 

set @x = 1 

if (@x = 0) 
begin 
    select 1 as Value into #temptable 
end 
else 
begin 
    select 2 as Value into #temptable 
end 

select * from #temptable 

drop table #temptable 

Antwort

1

Dies ist eine zweiteilige Frage und während Kev Fairchil d liefert eine gute Antwort auf die zweite Frage, ignoriert er die erste - warum wird der Fehler erzeugt?

Die Antwort liegt in der Funktionsweise des Präprozessors. Diese

SELECT field-list INTO #symbol ... 

in einen Parse-Baum aufgelöst, die direkt entspricht

DECLARE #symbol_sessionid TABLE(field-list) 
INSERT INTO #symbol_sessionid SELECT field-list ... 

und dies setzt #symbol in der Namentabelle des lokalen Bereich. Das Geschäft mit _sessionid besteht darin, jede Benutzersitzung mit einem privaten Namespace auszustatten. Wenn Sie zwei Hashes angeben (Symbol ##), wird dieses Verhalten unterdrückt. Das Munging und Ununging der Sessionid-Erweiterung ist (offen) transparent.

Das Ergebnis all dieser ist, dass mehrere INTO # Symbolsätze mehrere Deklarationen im selben Bereich erzeugen, was zu Msg 2714 führt.

0

Ich gehe davon aus, dass das Problem ist, dass Sie das #temptable nicht erstellt haben.

Sorry, ich kann nicht detaillierter sein, aber da Sie nicht einmal versucht haben zu erklären, was Sie sehen, erhalten Sie eine weniger als stellare Antwort.

1

Sie können das nicht wegen verzögerten Namensauflösung, können Sie es mit einem echten Tisch tun, nur

die Pfund-Zeichen nehmen

Sie auch die temporäre Tabelle oben zuerst erstellen könnte und dann eine regelmäßige tun Einfügen in Tabelle

0

Aus dem Aussehen des Codes scheint es, als ob Sie das in SQL Studio oder ähnliches prototypisiert haben, oder? Kann ich vermuten, dass Sie das ein paar Mal ausgeführt haben und es zu dem Punkt gebracht haben, wo es #temptable erstellt wurde, aber dann fehlschlug, bevor es zu Ende ging und die Tabelle wieder fallen ließ? Starten Sie das von Ihnen verwendete SQL-Bearbeitungstool neu und versuchen Sie es erneut.

1

Erster Schritt ... Überprüfen Sie, ob die Tabelle bereits existiert ... wenn ja, löschen Sie sie. Erstellen Sie als Nächstes die Tabelle explizit, anstatt SELECT INTO zu verwenden.

Sie werden es auf diese Weise viel zuverlässiger finden.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN 
DROP TABLE #temptable 
END 

CREATE TABLE #temptable (Value INT) 

declare @x int 

set @x = 1 

if (@x = 0) 
begin 
    INSERT INTO #temptable (Value) select 1 
end 
else 
begin 
    INSERT INTO #temptable (Value) select 2 
end 

select * from #temptable 

drop table #temptable 

auch hoffentlich die Tabellen- und Feldnamen werden für Ihr Beispiel vereinfacht und sind nicht das, was Sie wirklich sie nennen;)

- Kevin pour