Ich möchte, dass dies die ultimative Diskussion darüber ist, wie mithilfe von SQL-Anweisungen überprüft werden kann, ob eine Tabelle in SQL Server 2000/2005 vorhanden ist.
Wenn Sie bei Google nach der Antwort suchen, erhalten Sie so viele verschiedene Antworten. Gibt es eine offizielle / rückwärts- und vorwärtskompatible Methode?
Hier sind zwei Möglichkeiten, dies zu tun. Welcher der beiden ist der Standard / beste Weg, dies zu tun?
Erster Weg:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Zweiter Weg:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL bietet das Einfache
SHOW TABLES LIKE '%tablename%';
Aussage. Ich suche etwas ähnliches.
Antworten:
Für solche Abfragen ist es immer am besten, eine
INFORMATION_SCHEMA
Ansicht zu verwenden. Diese Ansichten sind (meistens) Standard in vielen verschiedenen Datenbanken und ändern sich selten von Version zu Version.Um zu überprüfen, ob eine Tabelle vorhanden ist, verwenden Sie:
quelle
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Beachten Sie auch, dass Sie Folgendes tun können, wenn Sie aus irgendeinem Grund nach einer temporären Tabelle suchen müssen:
quelle
Wir verwenden den
OBJECT_ID
Stil immer so lange ich mich erinnerequelle
OBJECT_ID('TableName', 'U')
, dass das Objekt eine Tabelle ist.IF EXISTS
Abfrage aus der akzeptierten Antwort immer wieder zu schreiben . Außerdem ist alles kryptisch, bis Sie die Dokumentation gelesen haben, insbesondere in T-SQL (oder einer anderen Variante).Bitte beachten Sie die folgenden Ansätze,
Ansatz 1: Verwenden der Ansicht INFORMATION_SCHEMA.TABLES
Wir können eine Abfrage wie unten schreiben, um zu überprüfen, ob eine Kundentabelle in der aktuellen Datenbank vorhanden ist.
Ansatz 2: Verwenden der Funktion OBJECT_ID ()
Wir können die Funktion OBJECT_ID () wie unten verwenden, um zu überprüfen, ob eine Kundentabelle in der aktuellen Datenbank vorhanden ist.
Ansatz 3: Verwenden der Katalogansicht von sys.Objects
Wir können die Katalogansicht von Sys.Objects verwenden, um die Existenz der Tabelle wie folgt zu überprüfen:
Ansatz 4: Verwenden der Katalogansicht von sys.Tables
Wir können die Sys.Tables-Katalogansicht verwenden, um das Vorhandensein der Tabelle wie folgt zu überprüfen:
Ansatz 5: Vermeiden Sie die Verwendung der Systemtabelle sys.sysobjects
Wir sollten vermeiden, die Systemtabelle sys.sysobjects direkt zu verwenden. Der direkte Zugriff darauf wird in einigen zukünftigen Versionen des SQL Servers nicht mehr empfohlen. Gemäß dem Microsoft BOL-Link schlägt Microsoft vor, die Katalogansichten sys.objects / sys.tables anstelle der Systemtabelle sys.sysobjects direkt zu verwenden.
verwiesen von: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
quelle
Suchen Sie nach einer Tabelle in einer anderen Datenbank:
quelle
Ich wollte nur eine Situation erwähnen, in der es wahrscheinlich etwas einfacher wäre, die
OBJECT_ID
Methode anzuwenden . DieINFORMATION_SCHEMA
Ansichten sind Objekte unter jeder Datenbank.https://msdn.microsoft.com/en-us/library/ms186778.aspx
Daher alle Tabellen, auf die Sie mit zugreifen
wird nur reflektieren, was drin ist
[database]
. Wenn Sie überprüfen möchten, ob Tabellen in einer anderen Datenbank vorhanden sind, ohne diese[database]
jedes Mal dynamisch zu ändern ,OBJECT_ID
können Sie dies sofort tun. Ex-funktioniert genauso gut wie
SQL SERVER 2016 Bearbeiten :
Ab 2016 vereinfachte Microsoft die Möglichkeit, vor dem Löschen nach nicht vorhandenen Objekten zu suchen, indem die
if exists
Schlüsselwörter zudrop
Anweisungen hinzugefügt wurden . Zum Beispiel,wird das gleiche tun wie
OBJECT_ID
/INFORMATION_SCHEMA
wrapper in 1 Codezeile.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
quelle
quelle
Die Verwendung des Informationsschemas ist die SQL-Standardmethode. Daher sollte es von allen Datenbanken verwendet werden, die es unterstützen.
quelle
Hier im obigen Code lautet der Tabellenname
Mapping_APCToFANavigator
.quelle
{ }
) auf der Editor - Symbolleiste zu schön Format und die Syntax markieren Sie es!Wenn Sie an verschiedenen Datenbanken arbeiten müssen:
quelle
Ich weiß, dass es eine alte Frage ist, aber ich habe diese Möglichkeit gefunden, wenn Sie vorhaben, sie oft anzurufen.
quelle
sysname
Datentyp nicht verwendenvarchar(50)
. Sollte keine veraltetesysobjects
Ansicht verwenden und berücksichtigt kein Schema.Sie können den folgenden Code verwenden
Oder
quelle
Fügen Sie hier nur hinzu, zum Nutzen von Entwicklern und anderen Datenbankadministratoren
Ein Skript, das @Tabellenname als Parameter empfängt
(kann den Schemanamen enthalten oder nicht) und gibt die folgenden Informationen zurück, wenn die schema.table vorhanden ist:
Ich habe dieses Skript erstellt, um es jedes Mal in anderen Skripten zu verwenden, wenn ich testen muss, ob eine Tabelle oder Ansicht vorhanden ist, und wenn dies der Fall ist, muss die object_id für andere Zwecke verwendet werden.
Es wird ein Fehler ausgegeben, wenn Sie entweder eine leere Zeichenfolge, einen falschen Schemanamen oder einen falschen Tabellennamen übergeben haben.
Dies kann sich innerhalb einer Prozedur befinden und beispielsweise -1 zurückgeben.
Als Beispiel habe ich eine Tabelle mit dem Namen "Facts.FactBackOrder" in einer meiner Data Warehouse-Datenbanken.
So habe ich das erreicht:
quelle
dbo.[hello.world ]
und das Skript würde sie aus mehreren Gründen nicht finden. Trotzdem ist es unwahrscheinlich, dass jemand eine solche Tabelle erstellen möchte, aber dennoch. Wie auch immer, IhreTHE_NAME
Spalte ist definiert alssysname', yet you try to squeeze 2
sysname` Spalten und ein Punkt (.
), alle in eckigen Klammern eingeschlossen ... diese wird eines Tages scheitern!In SQL Server 2000 können Sie Folgendes versuchen:
quelle
quelle
Etwas Wichtiges für alle, die ihre Lösung noch nicht gefunden haben: SQL Server! = MYSQL . Wenn Sie es mit MYSQL machen wollen , ist es ganz einfach
Posten Sie dies hier, weil es der Top-Hit bei Google ist.
quelle
quelle
Sie können dies verwenden:
quelle
quelle
- - Prozedur erstellen, um zu überprüfen, ob eine Tabelle vorhanden ist
- - Verwendung: Überprüfen Sie, ob Tabellenmigrationen vorhanden sind
quelle
quelle
Ich nehme hier das Erstellen einer Ansicht als Beispiel .
Weil ALTER / CREATE-Befehle nicht in BEGIN / END-Blöcken enthalten sein dürfen. Sie müssen die Existenz testen und löschen, bevor Sie eine Erstellung durchführen
Wenn Sie sich Sorgen machen, dass die Berechtigungen verloren gehen, können Sie auch die GRANT-Anweisungen skripten und am Ende erneut ausführen.
Sie könnten das Erstellen / Ändern in eine Zeichenfolge einschließen und eine EXEC ausführen - das könnte für große Ansichten hässlich werden
quelle
Wenn jemand versucht, dasselbe in linq to sql (oder insbesondere in linqpad) zu tun, aktivieren Sie die Option, Systemtabellen und -ansichten einzuschließen, und führen Sie den folgenden Code aus:
vorausgesetzt, Sie haben ein Objekt mit dem Namen in einer Eigenschaft namens item und das Schema in einer Eigenschaft namens schema, in der sich der Name der Quellvariablen befindet
a
quelle
Wenn dies die "ultimative" Diskussion sein soll, sollte beachtet werden, dass das Skript von Larry Leonard auch einen Remote-Server abfragen kann, wenn die Server verbunden sind.
quelle
Ich hatte einige Probleme bei der Auswahl von INFORMATIONAL_SCHEME und OBJECT_ID. Ich weiß nicht, ob es sich um ein Problem mit dem ODBC-Treiber oder etwas anderem handelt. Abfragen von SQL Management Studio waren beide in Ordnung.
Hier ist die Lösung:
Wenn die Abfrage fehlschlägt, befindet sich wahrscheinlich keine solche Tabelle in der Datenbank (oder Sie haben keine Zugriffsberechtigungen dafür).
Die Überprüfung erfolgt durch Vergleichen des vom SQL-Executor zurückgegebenen Werts (in meinem Fall Ganzzahl), der sich mit dem ODBC-Treiber befasst.
quelle
Es gibt noch eine weitere Option, um zu überprüfen, ob die Tabelle datenbankübergreifend vorhanden ist
quelle
Führen Sie diese Abfrage aus, um zu überprüfen, ob die Tabelle in der Datenbank vorhanden ist:
quelle
Betrachten Sie in einer Datenbank, dass Sie eine Tabelle t1 haben. Sie möchten ein Skript in einer anderen Datenbank ausführen, z. B. wenn t1 vorhanden ist, erstellen Sie nichts anderes als t1. Öffnen Sie dazu das visuelle Studio und gehen Sie wie folgt vor:
Klicken Sie mit der rechten Maustaste auf t1, dann auf Skripttabelle als, dann auf DROP und Create To und dann auf New Query Editor
Sie finden Ihre gewünschte Anfrage. Vergessen Sie jedoch nicht, die drop-Anweisung in der Abfrage zu kommentieren, bevor Sie dieses Skript ausführen, da Sie keine neue erstellen möchten, wenn bereits eine vorhanden ist.
Vielen Dank
quelle