1418 Stimmen

Prüfen, ob die Tabelle in SQL Server existiert

Ich möchte, dass dies die ultimative Diskussion darüber ist, wie man überprüft, ob eine Tabelle in SQL Server 2000/2005 mit SQL-Anweisungen existiert.

Wenn man nach der Antwort googelt, bekommt man so viele verschiedene Antworten. Gibt es eine offizielle/abwärts- und vorwärtskompatible Methode, dies zu tun?

Hier sind zwei Möglichkeiten, wie man das machen kann. Welcher der beiden Wege ist der Standard bzw. der 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 die einfache

SHOW TABLES LIKE '%tablename%'; 

Erklärung. Ich bin auf der Suche nach etwas Ähnlichem.

2 Stimmen

Warum ist es am besten, INFORMATION_SCHEMA.TABLES anstelle von sys.tables zu verwenden und dann nach dem Namen zu filtern und vielleicht eine type_desc-Wertprüfung hinzuzufügen?

1604voto

akmad Punkte 18503

Für Abfragen wie diese ist es immer am besten, eine INFORMATION_SCHEMA Ansicht. Diese Ansichten sind (meistens) Standard für viele verschiedene Datenbanken und ändern sich selten von Version zu Version.

Um zu prüfen, ob eine Tabelle existiert, verwenden Sie:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

2 Stimmen

Wie würden Sie vermeiden, dass schema_name in der where-Klausel enthalten ist? Der Vorteil des object_id()-Ansatzes besteht darin, dass er standardmäßig das aktuelle Schema verwendet.

16 Stimmen

Da die Eindeutigkeit eines Objektnamens allein (d.h. ohne Schema) nicht garantiert ist, gibt es keine 100%ig sichere Methode, dies zu tun. Wenn Sie mit einer DB arbeiten, die keine Namenskonflikte zwischen den Schemata hat, dann funktioniert das Weglassen von "TABLE_SCHEMA = 'TheSchema'" ganz gut.

37 Stimmen

Um nach einer temporären Tabelle zu suchen, müssen wir die tempdb-Datenbank abfragen und einen LIKE-Operator für den Tabellennamen verwenden SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'

346voto

James Bloomer Punkte 5002

Beachten Sie auch, dass Sie, falls Sie aus irgendeinem Grund eine temporäre Tabelle suchen müssen, dies tun können:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

16 Stimmen

Die Verwendung dieser Methode scheint den verbindungsspezifischen Charakter von temporären Tabellen zu respektieren. Die zuvor gepostete INFORMATION_SCHEMA-Abfrage gibt unabhängig von der Verbindung, über die die Tabelle erstellt wurde, Zeilen zurück.

304voto

Bob King Punkte 24518

Wir verwenden immer die OBJECT_ID Stil, so lange ich mich erinnern kann

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL

19 Stimmen

Ich glaube, das wäre schnell, wenn auch nicht sehr tragbar. Die Ansichten des Informationsschemas sind auf jedem DBRMS, das den Standard unterstützt, garantiert vorhanden. Außerdem garantiert eine einfache OBJECT_ID nicht, dass es sich bei dem Objekt um eine Tabelle handelt.

11 Stimmen

Danke Joe, ich habe mich gefragt, warum Sie OBJECT_ID vs. INFORMATION_SCHEMA.TABLES vs. sys.tables verwenden würden. Der Hinweis darauf, dass INFORMATION_SCHEMA Teil eines Standards ist, beantwortet diese Frage ziemlich genau. Übrigens ist es witzig, dass einer unserer Datenbankexperten, dem ich diese Frage stellen wollte, denselben Nachnamen hat wie Sie, das muss ein guter Nachname für Datenbanken sein.

30 Stimmen

@JoePineda: Dann verwenden Sie bitte OBJECT_ID('TableName', 'U') um zu garantieren, dass das Objekt eine Tabelle ist.

200voto

BrainCoder Punkte 4759

Bitte beachten Sie die nachstehenden Ansätze,

Ansatz 1: Verwendung der Ansicht INFORMATION_SCHEMA.TABLES

Wir können eine Abfrage wie unten schreiben, um zu prüfen, ob eine Tabelle Kunden in der aktuellen Datenbank vorhanden ist.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

Ansatz 2: Verwendung der Funktion OBJECT_ID()

Wir können die Funktion OBJECT_ID() wie folgt verwenden, um zu prüfen, ob in der aktuellen Datenbank eine Kundentabelle existiert.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

Ansatz 3: Verwendung der sys.Objects-Katalogansicht

Wir können die Sys.Objects-Katalogansicht verwenden, um das Vorhandensein der Tabelle zu überprüfen (siehe unten):

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

Ansatz 4: Verwendung der sys.Tables-Katalogansicht

Wir können die Katalogansicht Sys.Tables verwenden, um das Vorhandensein der Tabelle zu überprüfen (siehe unten):

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

Ansatz 5: Vermeiden Sie die Verwendung von sys.sysobjects Systemtabelle

Wir sollten es vermeiden, sys.sysobjects System Table direkt zu verwenden, da der direkte Zugriff darauf in einigen zukünftigen Versionen von Sql Server veraltet sein wird. Laut Microsoft BOL-Link schlägt Microsoft vor, die Katalogansichten sys.objects/sys.tables anstelle der sys.sysobjects-Systemtabelle direkt zu verwenden.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

verwiesen von: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

2 Stimmen

Denken Sie daran, die meisten der oben genannten Punkte anzupassen, wenn das Tabellenschema berücksichtigt werden muss (z. B. "dbo" oder ähnlich). Das könnte später Probleme ersparen, wenn die gleichen Tabellennamen in einem anderen Schema erstellt werden.

41voto

Larry Leonard Punkte 399

Suche nach einer Tabelle in einer anderen Datenbank:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

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