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.

29voto

user219628 Punkte 3405

Dies hat für mich funktioniert: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;

2 Stimmen

Das ist nur eine andere Syntax für das bedingte Löschen einer Tabelle. Es ist interessant, löst jedoch nicht das Problem des OP und ist größtenteils überflüssig. Wenn Sie nur prüfen, ob OBJECT_ID(N'tempdb..#Results') nicht null ist, dann reicht das aus, um zu beweisen, dass das Objekt bereits vorhanden ist.

28voto

Jetzt können Sie die folgende Syntax verwenden, wenn Sie eine der neuen Versionen von SQL Server (2016+) verwenden.

 DROP TABLE IF EXISTS schema.yourtable(auch temporäre Tabellen #...)

1 Stimmen

Ich verwende SSMS 17.3 und das zeigt Falsche Syntax in der Nähe des Schlüsselworts 'IF'.

9 Stimmen

@StingyJack Da die SQL-Syntax nicht von der SSMS-Version abhängt, sondern von der SQL-Server-Version, ist die IF [NOT] EXISTS-Klausel ab SQL Server 2016 verfügbar. Es spielt keine Rolle, welche SSMS-Version Sie verwenden.

23voto

Ivan Sivak Punkte 6588

Nur ein kleiner Kommentar von meiner Seite, da die OBJECT_ID für mich nicht funktioniert. Es gibt immer zurück, dass

`#tempTable existiert nicht

..obwohl es existiert. Ich habe herausgefunden, dass es unter einem anderen Namen gespeichert ist (mit _ Unterstrichen versehen) wie folgt :

#tempTable________

Dies funktioniert gut für mich:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;

7 Stimmen

Vorsicht: Dieser Code erkennt eine Tabelle, wenn sie von einem beliebigen Thread erstellt wurde. Einzelne # Temp-Tabellen werden separat pro Thread/Caller für eine gespeicherte Prozedur erstellt, weshalb die Unterstriche im Namen stehen, damit eine unterschiedliche Kopie pro Thread/Prozess existiert. Die Object_ID sollte für den aktuellen Thread in Ordnung sein, solange Sie auf SQL 2005 oder neuer sind.

13voto

DSR Punkte 339

Dies hat für mich funktioniert,

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

Hier hat tempdb.dbo (dbo ist nichts anderes als Ihr Schema) mehr Bedeutung.

10voto

gbn Punkte 407102

pmac72 verwendet GO, um die Abfrage in Chargen aufzuteilen und einen ALTER zu nutzen.

Sie scheinen die gleiche Charge auszuführen, aber sie zweimal auszuführen, nachdem Sie sie geändert haben: DROP... CREATE... bearbeiten... DROP... CREATE..

Vielleicht posten Sie Ihren exakten Code, damit wir sehen können, was passiert.

1 Stimmen

Dies ist eine Antwort, die als Kommentar fungieren sollte, da sie keine tatsächliche Antwort liefert.

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