792 Stimmen

Überprüfen Sie, ob eine temporäre Tabelle existiert, und löschen Sie sie, wenn sie vorhanden ist, bevor Sie eine temporäre Tabelle erstellen

Ich verwende den folgenden Code, um zu überprüfen, ob die temporäre Tabelle vorhanden ist und die Tabelle zu löschen, falls sie bereits existiert, bevor sie erneut erstellt wird. Es funktioniert einwandfrei, solange ich die Spalten nicht ändere. Wenn ich später eine Spalte hinzufüge, wird ein Fehler mit der Meldung "ungültige Spalte" angezeigt. Bitte lassen Sie mich wissen, was ich falsch mache.

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company CHAR(3),
    StepId TINYINT,
    FieldId TINYINT,
)

select company, stepid, fieldid from #Results

-- Bis hierhin funktioniert es einwandfrei

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company CHAR(3),
    StepId TINYINT,
    FieldId TINYINT,
    NewColumn NVARCHAR(50)
)

select company, stepid, fieldid, NewColumn from #Results

-- Funktioniert nicht

0 Stimmen

Wo fügst du die Spalte hinzu? Kannst du den genauen Code posten, der dir einen Fehler gibt?

0 Stimmen

Ich füge die Spalte zur Tabelle #Results hinzu. Wenn Sie den obigen Code kopieren und zum ersten Mal ausführen, erhalten Sie keine Fehler. Wenn Sie jetzt eine Spalte zur Temp-Tabelle hinzufügen und die Spalte im Select-Statement hinzufügen, wird angezeigt, dass die Spalte nicht gefunden wurde (oder so ähnlich).

27 Stimmen

Betrachten Sie die Verwendung des folgenden Musters: BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT. Wenn die Transaktion erfolgreich ist, wird die Tabelle entfernt. Wenn sie fehlschlägt, ist die Tabelle ebenfalls verschwunden (da sie innerhalb der Transaktion erstellt wurde). In jedem Fall: Keine Notwendigkeit zu prüfen, ob die Tabelle bereits existiert.

859voto

pmac72 Punkte 8382

Ich kann den Fehler nicht reproduzieren.

Vielleicht verstehe ich das Problem nicht.

Das folgende funktioniert für mich einwandfrei in SQL Server 2005, wobei die zusätzliche "foo"-Spalte im Ergebnis der zweiten Auswahl erscheint:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO

2 Stimmen

IF OBJECT_ID('tempdb..#Results') IST NICHT NULL TABELLE #Results löschen CREATE TABLE #Results (Company CHAR(3),StepId INT) wählen Unternehmen, StepId von #results jetzt zurück zum Erstellungsstatement gehen und am Ende eine Spaltenfeldid hinzufügen. Ändern Sie das SELECT-Statement, um auch FieldId einzuschließen, und führen Sie es aus.

41 Stimmen

'tempdb..#name' ist genau das, was ich brauchte. Ich habe 'dbo.#name' verwendet, wie ein Narr. Ich verstehe den tempdb Teil, aber was hat es mit den doppelten Punkten auf sich?

89 Stimmen

@Conrad.Dean Doppelpunkt ist eine Abkürzung für .dbo.

112voto

Pரதீப் Punkte 88269

Statt löschen und neu erstellen der temporären Tabelle können Sie diese leeren und wiederverwenden

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

Wenn Sie Sql Server 2016 oder Azure Sql Database verwenden, verwenden Sie die folgende Syntax, um die temporäre Tabelle zu löschen und neu zu erstellen. Weitere Informationen hier MSDN

Syntax

DROP TABLE [ IF EXISTS ] [ database_name . [ schema_name ] . | schema_name . ] table_name [ ,...n ]

Abfrage:

DROP TABLE IF EXISTS #Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )

0 Stimmen

Es scheint, dass die Methode truncate/reuse effizienter wäre als DROP TABLE IF EXISTS auf Sql Server 2016 und Azure Sql Database ebenfalls. Ist das nicht der Fall?

0 Stimmen

@prdp Warum schlagen Sie DROP TABLE IF Exists für SQL 2016 oder Azure vor? Die Syntax ist ab SQL 2008 verfügbar. Sehen Sie den MSDN-Link in Ihrer Antwort? Performance-Faktor?

4 Stimmen

Keine Sorge. Ich habe jetzt festgestellt, dass DROP TABLE ab SQL Server 2008 unterstützt wird, aber die Klausel IF EXISTS wurde erst 2016 eingeführt.

109voto

SDS Punkte 1011

Die Aussage sollte folgendermaßen lauten

  1. Aussage für die Tabelle ändern
  2. GO
  3. SELECT-Anweisung.

Ohne 'GO' dazwischen wird das Ganze als ein einzelnes Skript betrachtet und wenn die SELECT-Anweisung nach der Spalte sucht, wird sie nicht gefunden.

Mit 'GO' wird der Teil des Skripts bis 'GO' als eine einzelne Batch-Einheit betrachtet und wird ausgeführt, bevor mit der Abfrage nach 'GO' fortgefahren wird.

8 Stimmen

Dies sollte als die richtige Antwort markiert werden. Es geht nicht darum, dass das SELECT tatsächlich vor dem Erstellen der Tabelle ausgeführt wird, sondern darum, dass es analysiert und ein Fehler gemeldet wird, bevor es ausgeführt wird, weil es bereits eine Tabelle namens #Results gibt, die zum Zeitpunkt der Analyse noch keine FieldId-Spalte hat. Das Hinzufügen eines GO trennt die Abfrage in Batches auf, die jeweils separat analysiert und ausgeführt werden.

3 Stimmen

Ich kann nicht glauben, wie groß die Diskrepanz in den Stimmen zwischen dieser Antwort und der Top-Antwort ist, die den Code so sehr verändert hat - ohne zu erklären, warum - dass er als Antwort sinnlos war.

0 Stimmen

Diese Antwort beschreibt, warum es scheitert, und wie man es beheben kann. Die akzeptierte Antwort kann das Problem sicherlich nicht reproduzieren - weil sie anders geschrieben wurde und möglicherweise das tatsächliche Problem umgeht. Ich habe mich hier wieder gefunden, weil ich auf das gleiche Problem gestoßen bin und vergessen hatte, dass das Skript zuerst analysiert wird und dass temporäre Objekte Teil der Sitzung sind. Jetzt programmiere ich, indem ich es als SP schreibe und aufrufe, um zu debuggen, das ist eine andere Möglichkeit, das Problem zu vermeiden.

63voto

S Krishna Punkte 1079

Dies könnte mit einer einzigen Codezeile erreicht werden:

IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;

6 Stimmen

Ich muss mir das jeden Tag ansehen.

0 Stimmen

Oder mit moderner SQL Server DROP TABLE IF EXISTS #Results; wie in einigen der Antworten erwähnt.

61voto

vikas Punkte 911

Ich denke, das Problem ist, dass Sie das GO-Statement hinzufügen müssen, um die Ausführung in Batches aufzuteilen. Da das zweite Drop-Skript, d. H. IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results, die temporäre Tabelle nicht entfernt hat, die Teil eines einzelnen Batches ist. Können Sie bitte das folgende Skript ausprobieren?

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

GO

select company, stepid, fieldid from #Results

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

GO

select company, stepid, fieldid, NewColumn from #Results

1 Stimmen

Wichtig ist, dass tempdb.. im obigen Code sehr wichtig ist. Es muss dem Namen Ihrer Temp-Tabelle vorausgehen. Einfaches Überprüfen von OBJECT_ID('#Results') ist nicht genug. Temporäre Tabellen werden in der TempDB-Datenbank gespeichert. Laut Microsoft: TempDB-Systemdatenbank ist eine globale Ressource, die allen Benutzern zur Verfügung steht, die mit der Instanz von SQL Server verbunden sind oder mit der SQL-Datenbank verbunden sind.

0 Stimmen

Vielen Dank, @iCode. Das ist der Schlüssel zum Löschen der Temporären Tabellen: Es muss auf tempdb durchgeführt werden, oder sie werden nicht entfernt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X