sql-server - übersicht - transact sql




Überprüfen Sie, ob die Tabelle in SQL Server existiert (14)

    IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
      BEGIN 
          print 'deleted table';
          drop table t 
      END
    else 
      begin 
          print 'table not found' 
      end

Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
insert into t( name, lastname) values('john','doe');
insert into t( name, lastname) values('rose',NULL);

Select * from t
1   john    doe
2   rose    NULL

-- clean
drop table t

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 die einfachen SHOW TABLES LIKE '% tablename%' ; Erklärung. Ich suche etwas Ähnliches.


- - Erstellen Sie eine Prozedur, um zu prüfen, ob eine Tabelle existiert

DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - Wie zu verwenden: Überprüfen Sie, ob Tabellenmigrationen vorhanden sind

 CALL checkIfTableExists('muDbName', 'migrations', @output);

Betrachten Sie in einer Datenbank eine Tabelle t1. Sie möchten Skript auf anderen Datenbank wie - wenn t1 existieren, dann tun nichts anderes t1 erstellen. Um dies zu tun, öffnen Sie das Visual Studio und machen Sie folgendes:

Klicken Sie mit der rechten Maustaste auf t1, dann auf Script-Tabelle als, dann auf DROP und Create To und dann auf New Query Editor

Sie werden Ihre gewünschte Anfrage finden. Aber bevor Sie dieses Skript ausführen, vergessen Sie nicht, die Drop-Anweisung in der Abfrage zu kommentieren, da Sie keine neue erstellen möchten, wenn bereits eine vorhanden ist.

Vielen Dank


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-Link 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/


Etwas Wichtiges für jeden, der seine Lösung noch nicht gefunden hat: SQL Server! = MYSQL . Wenn Sie es mit MySQL machen wollen , ist es ziemlich einfach

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Dies hier zu veröffentlichen, weil es der Top-Hit bei Google ist.


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 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

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

Ich wollte nur eine Situation erwähnen, in der es wahrscheinlich einfacher wäre, die OBJECT_ID Methode zu verwenden. Die INFORMATION_SCHEMA Ansichten sind Objekte unter jeder Datenbank.

Die Informationsschemasichten werden in einem speziellen Schema namens INFORMATION_SCHEMA definiert. 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;

spiegelt nur wider, was in [database] . Wenn Sie überprüfen OBJECT_ID , ob Tabellen in einer anderen Datenbank vorhanden sind, ohne die [database] jedes Mal dynamisch zu ändern, OBJECT_ID Sie dies mit OBJECT_ID . 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 nach nicht vorhandenen Objekten zu suchen, indem er die if exists Schlüsselwörter zu drop Anweisungen hinzufügt. Beispielsweise,

drop table if exists mytablename

wird dasselbe tun wie OBJECT_ID / INFORMATION_SCHEMA Wrapper, in 1 Zeile Code.

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


Suche nach einer Tabelle in einer anderen Datenbank:

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

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

Wenn jemand versucht, das Gleiche in linq zu sql (oder speziell linqpad) zu tun, schalten Sie die Option ein, um Systemtabellen und Views einzubinden und diesen Code auszuführen:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

vorausgesetzt, Sie haben ein Objekt mit dem Namen in einer Eigenschaft mit dem Namen item und das Schema in einer Eigenschaft namens schema mit dem Namen der Quellvariablen a


Wir verwenden immer den OBJECT_ID Stil, solange ich mich erinnere

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

IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)

IF OBJECT_ID('mytablename') IS NOT NULL 




tsql