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

1143

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 bei Google nach der Antwort suchen, erhalten Sie so viele verschiedene Antworten. Gibt es eine offizielle / rückwärts- und vorwärtskompatible Methode?

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

SHOW TABLES LIKE '%tablename%'; 

Aussage. Ich suche etwas ähnliches.

Vincent
quelle
1
Warum ist es am besten, INFORMATION_SCHEMA.TABLES anstelle von sys.tables zu verwenden und dann mit dem Namen herauszufiltern, um möglicherweise eine type_desc-Wertprüfung hinzuzufügen?
DanteTheSmith

Antworten:

1332

Für solche Abfragen ist es immer am besten, eine INFORMATION_SCHEMAAnsicht 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 vorhanden ist, verwenden Sie:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
akmad
quelle
12
Funktioniert super! In T-SQL (als Antwort auf das Originalposter) ist es jedoch TABLE_SCHEMA, nicht SCHEMA_NAME. Danke für den Tipp.
Nicholas Piasecki
10
Da ein Objektname allein (dh ohne Schema) nicht garantiert eindeutig ist, gibt es keine 100% ausfallsichere Möglichkeit, dies zu tun. Wenn Sie mit einer Datenbank arbeiten, die keine Namenskonflikte zwischen Schemas aufweist, funktioniert das einfache Weglassen von "TABLE_SCHEMA = 'TheSchema'" einwandfrei.
Akmad
26
Um nach einer temporären Tabelle zu suchen, müssen wir die Tempdb-Datenbank abfragen und einen LIKE-Operator für den Tabellennamen verwendenSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant
4
Eine Antwort unten, die die OBJECT_ID-Funktion verwendet, funktioniert korrekt in Bezug auf temporäre
Rich Rousseau
4
Der @akmad SQL-Abfragecompiler sucht vor dem Ausführen der Abfrage nach der Tabelle und schlägt fehl, bevor er überhaupt gestartet wird.
Marc K
278

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
James Bloomer
quelle
10
Die Verwendung dieser Methode scheint die Pro-Verbindung-Natur von temporären Tabellen zu berücksichtigen. Die zuvor veröffentlichte INFORMATION_SCHEMA-Abfrage gibt Zeilen zurück, unabhängig von der Verbindung, die die Tabelle erstellt hat.
Rich Rousseau
238

Wir verwenden den OBJECT_IDStil immer so lange ich mich erinnere

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Bob King
quelle
16
Ich glaube, das wäre schnell, wenn auch nicht sehr portabel. Es ist garantiert, dass Informationsschemaansichten in jedem DBRMS vorhanden sind, das den Standard unterstützt. Darüber hinaus garantiert die einfache OBJECT_ID nicht, dass das Objekt eine Tabelle ist.
Joe Pineda
9
Danke Joe, ich habe mich gefragt, warum Sie OBJECT_ID vs INFORMATION_SCHEMA.TABLES vs sys.tables verwenden würden. Der Hinweis, dass INFORMATION_SCHEMA Teil eines Standards ist, beantwortet diese Frage ziemlich genau. Übrigens ist es lustig, einer unserer Datenbankexperten, dem ich diese Frage stellen wollte, hat den gleichen Nachnamen wie Sie, muss ein guter Nachname für Datenbanken sein.
Apeiron
24
@ JoePineda: Dann verwenden Sie den Fall, um sicherzustellen OBJECT_ID('TableName', 'U'), dass das Objekt eine Tabelle ist.
Allon Guralnek
1
@AllonGuralnek Also, anstatt einem einfachen und portablen Standard zu folgen, fügen Sie eine zusätzliche kryptische Information hinzu?
definiert
22
@DustinFineout: Die Frage wurde mit tsql markiert , sodass die Portabilität nicht so häufig gilt. Im Allgemeinen bin ich auf sehr wenige wirklich tragbare Codebasen gestoßen, und wenn Prägnanz geschätzt wird, ist es sicher besser, diese IF EXISTSAbfrage aus der akzeptierten Antwort immer wieder zu schreiben . Außerdem ist alles kryptisch, bis Sie die Dokumentation gelesen haben, insbesondere in T-SQL (oder einer anderen Variante).
Allon Guralnek
132

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 eine Kundentabelle 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: Verwenden der Funktion OBJECT_ID ()

Wir können die Funktion OBJECT_ID () wie unten verwenden, um zu überprüfen, ob eine Kundentabelle 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 Katalogansicht von sys.Objects

Wir können die Katalogansicht von Sys.Objects 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 Katalogansicht von sys.Tables

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

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

Wir sollten vermeiden, die Systemtabelle sys.sysobjects direkt zu verwenden. Der direkte Zugriff darauf wird in einigen zukünftigen Versionen des SQL Servers nicht mehr empfohlen. Gemäß dem Microsoft BOL-Link schlägt Microsoft vor, die Katalogansichten 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/

BrainCoder
quelle
37

Suchen Sie nach einer Tabelle in einer anderen Datenbank:

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

Ich wollte nur eine Situation erwähnen, in der es wahrscheinlich etwas einfacher wäre, die OBJECT_IDMethode anzuwenden . Die INFORMATION_SCHEMAAnsichten sind Objekte unter jeder Datenbank.

Die Informationsschemaansichten werden 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 reflektieren, was drin ist [database]. Wenn Sie überprüfen möchten, ob Tabellen in einer anderen Datenbank vorhanden sind, ohne diese [database]jedes Mal dynamisch zu ändern , OBJECT_IDkönnen Sie dies 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 vereinfachte Microsoft die Möglichkeit, vor dem Löschen nach nicht vorhandenen Objekten zu suchen, indem die if existsSchlüsselwörter zu dropAnweisungen hinzugefügt wurden . Zum Beispiel,

drop table if exists mytablename

wird das gleiche tun wie OBJECT_ID/ INFORMATION_SCHEMAwrapper in 1 Codezeile.

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

iliketocode
quelle
24
IF OBJECT_ID('mytablename') IS NOT NULL 
Sansalk
quelle
13

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

Vinko Vrsalovic
quelle
12
Dies sollte ein Kommentar gewesen sein.
underscore_d
3
Diese Antwort muss verbessert werden.
rory.ap
11
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.

Dilip Kumar Singh
quelle
2
Wenn Sie eine Postleitzahl, XML oder Datenproben, bitte diese Zeilen im Texteditor und klicken Sie auf den „Code - Beispiele“ Taste (markieren { }) auf der Editor - Symbolleiste zu schön Format und die Syntax markieren Sie es!
marc_s
1
Beachten Sie, dass der Zugriff auf Systemtabellen in zukünftigen Versionen von SQL Server möglicherweise nicht mehr verfügbar ist. Verwenden Sie stattdessen Schemaansichten.
Olivier Jacot-Descombes
10

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
Sogar Mien
quelle
1
Bist du sicher? Das Informationsschema auf meiner 2005-Box gibt nur den aktuellen Katalog zurück.
Federbrecher
8

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

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
dko
quelle
9
-1. Es ist sinnlos, eine Prozedur dafür zu haben, da es genauso viel Code gibt, um die Rückgabe aufzurufen und zu verbrauchen, wie einfach, um die Auswahl durchzuführen. Sollte sysnameDatentyp nicht verwenden varchar(50). Sollte keine veraltete sysobjectsAnsicht verwenden und berücksichtigt kein Schema.
Martin Smith
6

Sie können den folgenden Code verwenden

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Oder

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Reza Jenabi
quelle
5

Fügen Sie hier nur hinzu, zum Nutzen von Entwicklern und anderen Datenbankadministratoren

Ein Skript, das @Tabellenname als Parameter empfängt

(kann den Schemanamen enthalten 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 jedes Mal in anderen Skripten zu verwenden, wenn ich testen muss, ob eine Tabelle oder Ansicht vorhanden ist, und wenn dies der Fall ist, muss die object_id für andere Zwecke verwendet werden.

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

Dies kann sich innerhalb 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,@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 
Marcello Miorelli
quelle
Ihr Skript enthält viele Annahmen. Zum Beispiel könnte ich leicht eine Tabelle mit dem Namen erstellen, dbo.[hello.world ]und das Skript würde sie aus mehreren Gründen nicht finden. Trotzdem ist es unwahrscheinlich, dass jemand eine solche Tabelle erstellen möchte, aber dennoch. Wie auch immer, Ihre THE_NAMESpalte ist definiert als sysname', yet you try to squeeze 2 sysname` Spalten und ein Punkt ( .), alle in eckigen Klammern eingeschlossen ... diese wird eines Tages scheitern!
Deroby
@deroby Ich bin damit einverstanden, dass sysname nicht der beste zu verwendende Datentyp ist, aber das Skript wurde lange Zeit fehlerfrei ausgeführt. Ich würde nur dann Zeit damit verbringen, wenn ich eine vernünftige Situation finde, in der es nicht funktioniert. Noch besser, Sie nehmen diesen Code, verbessern ihn und veröffentlichen ihn hier als Antwort. Ich werde ihn testen. Wenn er funktioniert, werde ich Ihre Antwort positiv bewerten.
Marcello Miorelli
5

In SQL Server 2000 können Sie Folgendes versuchen:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
Dipi böse
quelle
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Mokassin
quelle
2

Etwas Wichtiges für alle, die ihre Lösung noch nicht 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.

phil294
quelle
4
-1, weil das OP genau nach einer SQL Server-Lösung für das Problem fragt, nicht nach der MySQL-Lösung. Er schrieb über MySQL, weil er die Lösung auf diesem DBMS kannte und dasselbe Ergebnis auf SQL Server wollte. Ihre Antwort ist auch nicht einmal eine MySQL-Abfrage, sondern ein PHP-Code, der mit MySQL funktioniert.
mordack550
1
@ mordack550, ich stimme Blauhirn zu. Er hat recht. Dies ist der Top-Hit bei Google, um herauszufinden, ob eine Tabelle in SQL vorhanden ist. Seine Absichten sind gut und seine Informationen sind hilfreich. 1
Mark
Es ist bedauerlich, dass Microsoft die Gewohnheit hat, gemeinsame Standards und Muster wie SQL zu umarmen / zu erweitern / zu löschen. Ich wünschte wirklich, sie hätten ihrer Implementierung eines SQL-Servers einen richtigen Namen gegeben, damit die Benutzer eindeutige Referenzen für ihr Produkt identifizieren können.
Psaxton
2
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
Krishnaraj Barvathaya
quelle
2

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
HdO
quelle
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
MarceloMadnezz
quelle
1

- - Prozedur erstellen, 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);
Mathieu Dierckx
quelle
1
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
Mohamad Reza Shahrestani
quelle
1

Ich nehme hier das Erstellen einer Ansicht als Beispiel .

Weil ALTER / CREATE-Befehle nicht in BEGIN / END-Blöcken enthalten sein dürfen. Sie müssen die Existenz testen und löschen, bevor Sie eine Erstellung durchführen

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

Wenn Sie sich Sorgen machen, dass die Berechtigungen verloren gehen, können Sie auch die GRANT-Anweisungen skripten und am Ende erneut ausführen.

Sie könnten das Erstellen / Ändern in eine Zeichenfolge einschließen und eine EXEC ausführen - das könnte für große Ansichten hässlich werden

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
Kelum Sampath Edirisinghe
quelle
0

Wenn jemand versucht, dasselbe in linq to sql (oder insbesondere in linqpad) zu tun, aktivieren Sie die Option, 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, in der sich der Name der Quellvariablen befindet a

Maslow
quelle
0

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

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
user3651072
quelle
Vielleicht ist es besser geeignet, dies als Kommentar zu Leonards Antwort oder als Bearbeitung hinzuzufügen?
EWit
0

Ich hatte einige Probleme bei 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, befindet sich wahrscheinlich keine solche Tabelle in der Datenbank (oder Sie haben keine Zugriffsberechtigungen dafür).

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

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
Michael Quad
quelle
Schlägt mit welcher Ausgabe fehl?
wscourge
@wscourge, SQL-Abfrage fehlgeschlagen oder ähnliches. Ich überprüfe nur den Rückgabewert von der Executor-Funktion.
Michael Quad
Fügen Sie es Ihrer Antwort hinzu
wscourge
0

Es gibt noch eine weitere Option, um zu überprüfen, ob die Tabelle datenbankübergreifend vorhanden ist

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
Jitan Gupta
quelle
-1

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';
S Krishna
quelle
-6

Betrachten Sie in einer Datenbank, dass Sie eine Tabelle t1 haben. Sie möchten ein Skript in einer anderen Datenbank ausführen, z. B. wenn t1 vorhanden ist, erstellen Sie nichts anderes als t1. Öffnen Sie dazu das visuelle Studio und gehen Sie wie folgt vor:

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

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

Vielen Dank

Sumon
quelle
In SSMS 2012 wird die If-Exists-Prüfung nicht mehr durchgeführt, falls dies jemals der Fall war (ich kann mich nicht erinnern, wie frühere Versionen das obige Skript generiert haben). Vielleicht irren Sie sich mit der Art und Weise, wie andere DB-Tools Tabellenobjekte skripten?
Ivaylo Slavov
SSMS führt die If-Exists-Prüfung durch, wenn Sie dazu aufgefordert werden. Extras> Optionen> SQL Server-Objekt-Explorer> Skripterstellung> "Objekt-Skripterstellungsoptionen": "Auf Objektexistenz prüfen" = True
Seann Alexander