Frage

Warum können Sie das nicht tun und gibt es eine Lösung?

Sie erhalten diesen Fehler.

MSG 2714, Stufe 16, Status 1, Zeile 13 Es gibt bereits ein Objekt mit dem Namen "#Temptable" in der Datenbank.

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
War es hilfreich?

Lösung

Dies ist eine zweiteilige Frage und während Kev Fairchild eine gute Antwort auf die zweite Frage gibt, ignoriert er die erste völlig – Warum wird der Fehler erzeugt?

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

SELECT field-list INTO #symbol ...

wird in einen Analysebaum aufgelöst, der direkt äquivalent ist

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

und dadurch wird #symbol in die Namenstabelle des lokalen Bereichs eingefügt.Das Geschäft mit _sessionid besteht darin, jeder Benutzersitzung einen privaten Namespace bereitzustellen.Wenn Sie zwei Hashes (##symbol) angeben, wird dieses Verhalten unterdrückt.Das Munging und Unmunging der Session-ID-Erweiterung ist (offensichtlich) transparent.

Das Ergebnis all dessen ist, dass mehrere INTO #symbol-Klauseln mehrere Deklarationen im gleichen Bereich erzeugen, was zu Meldung 2714 führt.

Andere Tipps

Aufgrund der verzögerten Namensauflösung ist das nicht möglich. Sie können es mit einer echten Tabelle tun, indem Sie einfach die Nummernzeichen entfernen

Sie können die temporäre Tabelle auch zuerst oben erstellen und dann eine reguläre Einfügung in die Tabelle vornehmen

Erster Schritt...Überprüfen Sie, ob die Tabelle bereits existiert ...Wenn ja, löschen Sie es.Als nächstes erstellen Sie die Tabelle explizit, anstatt SELECT INTO zu verwenden...

Auf diese Weise wird es viel zuverlässiger sein.

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

Hoffentlich sind die Tabellen- und Feldnamen für Ihr Beispiel vereinfacht und entsprechen nicht Ihren Vorstellungen Wirklich Ruf Sie an ;)

– Kevin Fairchild

Die verzögerte Namensauflösung ist auch der Grund dafür, dass Sie nicht sicher sein können, dass sp_depends korrekte Ergebnisse zurückgibt. Schauen Sie sich diesen Beitrag an, den ich vor einiger Zeit geschrieben habe Sind Sie auf sp_depends angewiesen (kein Wortspiel beabsichtigt)

Ich vermute, dass das Problem darin besteht, dass Sie das #temptable nicht geschaffen haben.

Tut mir leid, dass ich nicht näher darauf eingehen kann, aber da Sie nicht einmal versucht haben zu erklären, was Sie sehen, erhalten Sie eine weniger gute Antwort.

Wie der Code aussieht, scheint es, als hätten Sie einen Prototyp in SQL Studio oder ähnlichem erstellt, oder?Kann ich vermuten, dass Sie dies ein paar Mal ausgeführt haben und es an den Punkt gelangt ist, an dem es #temptable erstellt hat, dann aber fehlgeschlagen ist, bevor es das Ende erreicht hat, und die Tabelle erneut gelöscht hat?Starten Sie das von Ihnen verwendete SQL-Bearbeitungstool neu und versuchen Sie es erneut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top