webentwicklung-frage-antwort-db.com.de

Überprüfen Sie, ob die Tabelle in SQL Server vorhanden ist

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 nach der Antwort googeln, erhalten Sie so viele verschiedene Antworten. Gibt es eine offizielle/vorwärts- und rückwärtskompatible Möglichkeit, dies zu tun?

Hier sind zwei Möglichkeiten, dies zu tun. Welcher von 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 liefert das Einfache

SHOW TABLES LIKE '%tablename%'; 

aussage. Ich suche etwas ähnliches.

1030
Vincent

Für Abfragen wie diese 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 existiert, verwenden Sie:

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

Beachten Sie auch, dass Sie Folgendes tun können, wenn Sie aus irgendeinem Grund nach einer temporären Tabelle suchen müssen:

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

Wir verwenden immer den OBJECT_ID -Stil, solange ich mich erinnere

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

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 in der aktuellen Datenbank eine Kundentabelle vorhanden ist.

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

Ansatz 2: Verwendung der OBJECT_ID () - Funktion

Wir können die OBJECT_ID () -Funktion wie folgt verwenden, um zu überprüfen, ob eine Customers-Tabelle in der aktuellen Datenbank vorhanden ist.

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

Ansatz 3: Verwenden der sys.Objects-Katalogansicht

Wir können die Sys.Objects-Katalogansicht verwenden, um die Existenz 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

Ansatz 4: Verwenden der sys.Tables-Katalogansicht

Wir können die Sys.Tables-Katalogansicht verwenden, um die Existenz 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

Ansatz 5: Vermeiden Sie die Verwendung der sys.sysobjects-Systemtabelle

Wir sollten es vermeiden, die sys.sysobjects-Systemtabelle direkt zu verwenden. In einigen zukünftigen Versionen von SQL Server wird der direkte Zugriff darauf veraltet sein. Gemäß 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/

113
BrainCoder

Suchen nach einer Tabelle in einer anderen Datenbank:

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

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

Die Informationsschemasichten sind in einem speziellen Schema mit dem Namen 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 mit 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 widerspiegeln, was in [database] ist. Wenn Sie überprüfen möchten, ob Tabellen in einer anderen Datenbank vorhanden sind, ohne den [database] jedes Mal dynamisch zu ändern, können Sie dies mit OBJECT_ID sofort tun . 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 :

Ab 2016 hat Microsoft die Möglichkeit vereinfacht, vor dem Löschen nach nicht vorhandenen Objekten zu suchen, indem if exists Schlüsselwörter zu drop Anweisungen hinzugefügt wurden. Zum Beispiel,

drop table if exists mytablename

wird das Gleiche tun wie die Wrapper OBJECT_ID/INFORMATION_SCHEMA in einer Codezeile.

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

23
iliketocode
IF OBJECT_ID('mytablename') IS NOT NULL 
21
sansalk

Die Verwendung des Informationsschemas ist die SQL-Standardmethode, daher sollte es von allen Datenbanken verwendet werden, die es unterstützen.

15
Vinko Vrsalovic
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 lautet der Tabellenname Mapping_APCToFANavigator.

11

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
10
Even Mien

Ich weiß, es ist eine alte Frage, aber ich habe diese Möglichkeit gefunden, wenn Sie es oft anrufen möchten.

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

Fügen Sie hier nur zum Nutzen der Entwickler und anderen Datenbankadministratoren hinzu

ein Skript, das @Tabellenname als Parameter empfängt

(der den Schemanamen enthalten kann oder nicht) und gibt die folgenden Informationen zurück, wenn die schema.table vorhanden ist:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

Ich habe dieses Skript erstellt, um es in anderen Skripten zu verwenden, wenn ich testen muss, ob eine Tabelle oder Sicht vorhanden ist, und wenn dies der Fall ist, muss die object_id für andere Zwecke verwendet werden.

Es wird ein Fehler ausgelöst, wenn Sie entweder eine leere Zeichenfolge, einen falschen Schemanamen oder einen falschen Tabellennamen übergeben haben.

dies könnte sich in 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:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@[email protected])



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
5

In SQL Server 20 können Sie versuchen:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
4
dipi evil

Sie können dies verwenden:

     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
3
BTE
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

Wichtig für alle, die noch keine Lösung gefunden haben: SQL Server! = MYSQL. Wenn Sie es mit MYSQL machen wollen, ist es ganz 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";

Posten Sie dies hier, weil es der Top-Hit bei Google ist.

2
Blauhirn

Erstellen Sie eine Prozedur, um zu überprüfen, ob eine Tabelle vorhanden ist


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 ;

Verwendung: Überprüfen Sie, ob Tabellenmigrationen vorhanden sind


 CALL checkIfTableExists('muDbName', 'migrations', @output);
1
Mathieu Dierckx
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
1
MarceloMadnezz

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 miteinander verbunden sind.

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

Wenn jemand versucht, dasselbe in linq to sql (oder insbesondere in linqpad) zu tun, aktivieren Sie die Option, um Systemtabellen und -ansichten einzuschließen, und führen Sie den folgenden Code aus:

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 namens item und das Schema in einer Eigenschaft namens schema, wobei der Name der Quellvariablen a lautet.

0
Maslow

Ich hatte einige Probleme mit 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:

SELECT COUNT(*) FROM <yourTableNameHere>

Wenn die Abfrage fehlschlägt, ist wahrscheinlich keine solche Tabelle in der Datenbank vorhanden (oder Sie haben keine Zugriffsberechtigungen dafür).

Die Prüfung erfolgt durch Vergleichen des vom SQL-Executor zurückgegebenen Werts (in meinem Fall Integer), der sich mit dem ODBC -Treiber befasst.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
0
Michael Quad

Führen Sie diese Abfrage aus, um zu überprüfen, ob die Tabelle in der Datenbank vorhanden ist:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
0
S Krishna