Frage

Ich würde dies gerne die ultimative Diskussion sein, wie Sie überprüfen, ob eine Tabelle in SQL Server 2000/2005 mit SQL-Anweisungen besteht.

Wenn Sie Google für die Antwort, man so viele verschiedene Antworten. Gibt es eine offizielle / vorwärts- und rückwärtskompatible Art und Weise tun?

Hier sind zwei Möglichkeiten, es zu tun. Welche unter dem beide ist der Standard / beste Weg, es zu tun?

Erste Möglichkeit:

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

Aussage. Ich suche nach etwas ähnlichem.

War es hilfreich?

Lösung

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

Um zu überprüfen, ob eine Tabelle Verwendung vorhanden ist:

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

Andere Tipps

Beachten Sie auch, dass, wenn Sie aus irgendeinem Grund für eine temporäre Tabelle überprüfen möchten, können Sie dies tun:

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

Wir verwenden immer die OBJECT_ID Art für so lange ich mich erinnern

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

Bitte beachten Sie die folgenden Ansätze,

Ansatz 1: Verwendung INFORMATION_SCHEMA.TABLES ansehen

Wir können eine Abfrage wie unten schreiben zu überprü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 von OBJECT_ID () Funktion

Wir können OBJECT_ID () Funktion wie unten verwenden, um zu überprüfen, ob eine Tabelle Kunden 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 sys.objects Catalog

Wir können die sys.objects Katalogansicht verwenden, um die Existenz der Tabelle zu überprüfen, wie unten dargestellt:

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 sys.tables Catalog

Wir können die sys.tables Katalogansicht verwenden, um die Existenz der Tabelle zu überprüfen, wie unten dargestellt:

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

Ansatz 5: Vermeiden Sie sys.sysobjects Systemtabelle Mit

Wir sollten vermeiden sys.sysobjects using System Tabelle direkt, direkten Zugang zu ihm in einigen zukünftigen Versionen des SQL Server veraltet. Gemäß Microsoft BOL Link, schlägt Microsoft direkt auf die Katalogansichten sys.objects / sys.tables statt sys.sysobjects Systemtabelle zu verwenden.

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

bezeichnet von:

Nach einer Tabelle auf eine andere Datenbank:

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

Ich wollte nur eine Situation erwähnen, wo es wahrscheinlich ein wenig leichter zu verwenden, um die OBJECT_ID Methode wäre. Die INFORMATION_SCHEMA Ansichten sind Objekte unter jeder Datenbank -

  

Die Informationsschemata Ansichten werden in einem speziellen Schema definiert benannt   INFORMATION_SCHEMA. Dieses Schema ist in jeder Datenbank enthalten ist.

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

Deshalb werden alle Tabellen, die Sie Zugriff mit

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 das widerspiegeln, was in [database] ist. Wenn Sie, wenn Tabellen lesen wollte andere Datenbank vorhanden sein, ohne dynamisch die [database] jedes Mal zu ändern, lassen OBJECT_ID tun Sie dies aus der Box. 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 :

mit 2016 starten, vereinfachte Microsoft die Möglichkeit für nicht vorhandene Objekte zu überprüfen, vor dem Abwurf, durch den if exists Hinzufügen von Keywords Aussagen drop. Zum Beispiel:

drop table if exists mytablename

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

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

IF OBJECT_ID('mytablename') IS NOT NULL 

, um das Informationsschema verwenden wird, um den SQL-Standard-Weg, es zu tun, so dass es von allen Datenbanken verwendet werden soll, die es unterstützen.

Wenn Sie auf verschiedene Datenbanken arbeiten:

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
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 in dem obigen Code, der Tabellenname ist Mapping_APCToFANavigator.

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

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

Nur das Hinzufügen hier zum Nutzen der Entwickler und Kollegen DBAs

ein Skript, das @Tablename als Parameter

empfängt

(die kann oder auch nicht das schema enthält) und gibt die Informationen weiter unten, wenn die schema.tabelle vorhanden ist:

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

produzierte ich dieses Skript in anderen Skripten verwendet werden, jedes Mal, ich brauche zu testen, ob eine Tabelle oder Sicht vorhanden ist, und wenn es nicht, seine object_id bekommt für andere Zwecke verwendet werden.

Es wirft einen Fehler, wenn Sie entweder eine leere Zeichenfolge, falsche Schemanamen oder falsche Tabellennamen übergeben.

dies innerhalb einer Prozedur sein könnte und -1 zurück zum Beispiel.

Als Beispiel habe ich eine Tabelle „Facts.FactBackOrder“ in einem meiner Data Warehouse-Datenbanken genannt.

Dies ist, wie ich dieses Ziel 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,@Z-@I)



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 

In SQL Server 2000 Sie können versuchen:

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

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
    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

Etwas wichtig für jemanden zu kennen, der ihre Lösung noch nicht gefunden hat: SQL Server! = MYSQL . Wenn Sie wollen, es zu tun mit MYSQL , es ist 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";

dieses Posting hier, weil es der Top-Hit bei Google ist.

select name from SysObjects where xType='U' and name like '%xxx%' order by name

- - create procedure 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 ;

- - wie man verwendet: überprüfen, ob Tabelle Migrationen existiert


 CALL checkIfTableExists('muDbName', 'migrations', @output);
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

Wenn jemand versucht, diese gleiche Sache in Linq zu tun, um zu SQL (oder besonders LINQPad) einschalten Option Systemtabellen und Ansichten enthalten und diesen Code tun:

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

gegeben, dass Sie ein Objekt mit dem Namen in einer Eigenschaft namens Artikeln haben, und das Schema in einer Eigenschaft namens Schema, in dem die Quelle Variablenname a

ist

Wenn dies die ‚ultimative‘ Diskussion sein soll, dann sollte es, dass Larry Leonard zu beachten, Skript einen Remote-Server als auch abfragen, wenn die Server verbunden sind.

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

Ich habe einige Probleme hat entweder mit von INFORMATIONAL_SCHEME und OBJECT_ID auswählen. Ich weiß nicht, ob es ein Problem von ODBC-Treiber oder etwas ist .. Abfragen von SQL Management Studio, beide waren in Ordnung.

Hier ist die Lösung:

SELECT COUNT(*) FROM <yourTableNameHere>

Also, wenn die Abfrage fehlschlägt, gibt es wahrscheinlich keine solche Tabelle in der Datenbank (oder Sie haben keine Zugriffsrechte darauf haben).

Die Prüfung, indem der Wert (integer in meinem Fall) zurück von SQL-Executor erfolgt, die mit ODBC-Treiber befasst ..

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

Führen Sie diese Abfrage 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';
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

Sehen Sie in einer Datenbank eine Tabelle t1 haben. Sie Skript auf andere Datenbank laufen wie - wenn t1 existieren dann nichts anderes tun t1 erstellen. Um dieses offene Visual Studio zu tun und wie folgt vor:

Rechtsklick auf t1, dann Script-Tabelle als, dann DROP und erstellen, um dann neue Abfrage-Editor

werden Sie Ihre gewünschte Abfrage finden. Aber bevor das Skript ausgeführt wird, vergessen Sie nicht die Drop-Anweisung in der Abfrage kommentieren, wie Sie nicht neue schaffen wollen, wenn man schon.

Danke

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top