Frage Überprüfen Sie, ob die Tabelle in SQL Server existiert


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

Wenn Sie für die Antwort Google verwenden, erhalten Sie so viele verschiedene Antworten. Gibt es eine offizielle / rückwärts und vorwärts kompatible Art, es zu tun?

Hier sind zwei Möglichkeiten, dies zu tun. Welcher der beiden ist der beste Standard dafür?

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%'; 

Erklärung. Ich suche etwas Ähnliches.


878
2017-10-03 16:00


Ursprung


Antworten:


Für Anfragen wie diese ist es immer am besten, ein zu verwenden INFORMATION_SCHEMA Aussicht. Diese Ansichten sind (meistens) Standard in vielen verschiedenen Datenbanken und ändern sich selten von Version zu Version.

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

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

1062
2017-10-03 16:17



Beachten Sie auch, wenn Sie aus irgendeinem Grund nach einer temporären Tabelle suchen müssen:

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

225
2018-01-28 14:50



Wir benutzen immer die OBJECT_ID Stil, solange ich mich erinnere

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

180
2017-10-03 16:05



Bitte beachten Sie die folgenden Ansätze,

Vorgehensweise 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 existiert.

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

Ansatz 2: Verwenden der OBJECT_ID () Funktion

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

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

Methode 3: Verwenden der sys.Objects-Katalogsicht

Wir können die Sys.Objects-Katalogsicht verwenden, um das Vorhandensein der Tabelle wie folgt zu überprüfen:

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

Methode 4: Verwenden der sys.Tables-Katalogansicht

Wir können die Sys.Tables-Katalogansicht verwenden, um das Vorhandensein der Tabelle wie folgt zu überprüfen:

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

Methode 5: Vermeiden Sie die Verwendung der Systemtabelle sys.sysobjects

Wir sollten es vermeiden, Systemtabelle sys.sysobjects direkt zu verwenden, der direkte Zugriff darauf wird in einigen zukünftigen Versionen des Sql Servers veraltet sein. Laut Microsoft BOL-Verknüpfung schlägt Microsoft vor, die Katalogsichten sys.objects / sys.tables anstelle der Systemtabelle sys.sysobjects 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/


85
2017-12-22 12:01



Suche nach einer Tabelle in einer anderen Datenbank:

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

28
2018-03-15 17:19



IF OBJECT_ID('mytablename') IS NOT NULL 

19
2017-11-22 09:59



Wollte nur eine Situation erwähnen, in der es wahrscheinlich ein wenig einfacher wäre, das zu benutzen OBJECT_ID Methode. Das INFORMATION_SCHEMA Ansichten sind Objekte unter jeder Datenbank-

Die Informationsschemasichten sind in einem speziellen Schema definiert   INFORMATION_SCHEMA. Dieses Schema ist in jeder Datenbank enthalten.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Daher alle Tabellen, auf die Sie zugreifen

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

wird nur reflektieren, was drin ist [database]. Wenn Sie überprüfen möchten, ob Tabellen in Ein weiterer Datenbank existiert, ohne die Datei dynamisch zu ändern [database] jedes Mal, OBJECT_ID Sie können dies sofort machen. Ex-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

funktioniert genauso gut wie

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Bearbeiten:

Seit 2016 vereinfacht Microsoft die Möglichkeit, vor dem Löschen auf nicht existierende Objekte zu prüfen, indem er die Option hinzufügt if exists Schlüsselwörter zu dropAussagen. Beispielsweise,

drop table if exists mytablename

wird das Gleiche tun wie OBJECT_ID / INFORMATION_SCHEMA Wrapper, in 1 Codezeile.

https://blogs.msdn.microsoft.com/sqlserververageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/


18
2018-06-22 17:18



Die Verwendung des Informationsschemas ist der SQL-Standard, um es zu tun, daher sollte es von allen Datenbanken verwendet werden, die es unterstützen.


17
2017-10-03 16:03



IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

Hier im obigen Code ist der Tabellenname Mapping_APCToFANavigator.


10
2018-04-07 10:39



Wenn Sie an verschiedenen Datenbanken arbeiten müssen:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END

8
2017-10-21 14:58



Ich weiß, es ist eine alte Frage, aber ich habe diese Möglichkeit gefunden, wenn Sie vorhaben, es oft zu nennen.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

8
2018-01-21 15:37