sql-server - microsoft - sql server management studio 2016 download english




Controlla se la tabella esiste in SQL Server (15)

    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

Mi piacerebbe che questa fosse la discussione finale su come verificare se esiste una tabella in SQL Server 2000/2005 utilizzando le istruzioni SQL.

Quando si risponde a Google, si ottengono così tante risposte diverse. Esiste un modo ufficiale, avanti e indietro compatibile per farlo?

Ecco due possibili modi per farlo. Quale tra i due è il modo standard / migliore per farlo?

Primo modo:

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;

Secondo modo:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL fornisce il semplice

SHOW TABLES LIKE '%tablename%'; 

dichiarazione. Sto cercando qualcosa di simile.


- - crea una procedura per verificare se esiste una tabella

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 ;

- - come usare: controlla se esistono migrazioni di tabelle

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

Alla ricerca di una tabella su un altro database:

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

In SQL Server 2000 puoi provare:

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

Per query come questa è sempre meglio usare una vista INFORMATION_SCHEMA . Queste viste sono (per lo più) standard su molti diversi database e raramente cambiano da versione a versione.

Per verificare se esiste una tabella, utilizzare:

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

Qualcosa di importante da sapere per chiunque non abbia ancora trovato la sua soluzione: SQL server! = MYSQL . Se vuoi farlo con MySQL , è abbastanza semplice

    $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";

Inserendo questo qui perché è la migliore hit di Google.


Se qualcuno sta provando a fare la stessa cosa in linq a sql (o in particolare linqpad) attiva l'opzione per includere tabelle e viste di sistema e fai questo codice:

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

dato che hai un oggetto con il nome in una proprietà chiamata item, e lo schema in una proprietà chiamata schema dove il nome della variabile di origine è a


Se questa è la discussione 'definitiva', allora si dovrebbe notare che lo script di Larry Leonard può interrogare anche un server remoto se i server sono collegati.

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

Si prega di consultare i seguenti approcci,

Approccio 1: utilizzo della vista INFORMATION_SCHEMA.TABLES

Possiamo scrivere una query come di seguito per verificare se esiste una tabella clienti nel database corrente.

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

Approccio 2: utilizzo della funzione OBJECT_ID ()

Possiamo usare la funzione OBJECT_ID () come sotto per verificare se esiste una tabella clienti nel database corrente.

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

Approccio 3: Uso di sys.Objects Catalog View

Possiamo utilizzare la vista del catalogo Sys.Objects per verificare l'esistenza della tabella come mostrato di seguito:

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

Approccio 4: Uso di sys.Tables Visualizza catalogo

Possiamo usare la vista del catalogo Sys.Tables per verificare l'esistenza della tabella come mostrato di seguito:

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

Approccio 5: evitare l'uso della tabella di sistema sys.sysobjects

Evitiamo di utilizzare direttamente la tabella di sistema sys.sysobjects, l'accesso diretto ad esso sarà deprecato in alcune versioni future del server Sql. Come per il collegamento Microsoft BOL, Microsoft suggerisce di utilizzare direttamente le viste del catalogo sys.objects / sys.tables invece della tabella di sistema sys.sysobjects.

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

riferito da: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


So che è una vecchia domanda, ma ho trovato questa possibilità se prevedi di chiamarla spesso.

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

Volevo solo menzionare una situazione in cui sarebbe probabilmente un po 'più semplice utilizzare il metodo OBJECT_ID . Le viste INFORMATION_SCHEMA sono oggetti in ogni database-

Le viste dello schema delle informazioni sono definite in uno schema speciale denominato INFORMATION_SCHEMA. Questo schema è contenuto in ogni database.

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

Quindi tutte le tabelle a cui si accede utilizzando

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;

rifletterà solo ciò che è in [database] . Se si desidera verificare se esistono tabelle in un altro database, senza modificare in modo dinamico il [database] ogni volta, OBJECT_ID consente di eseguire questa operazione. Ex-

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

funziona altrettanto bene

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

Modifica SQL SERVER 2016 :

A partire dal 2016, Microsoft ha semplificato la possibilità di verificare la presenza di oggetti inesistenti prima di rilasciarli, aggiungendo le parole chiave if exists to drop . Per esempio,

drop table if exists mytablename

farà la stessa cosa dei wrapper OBJECT_ID / INFORMATION_SCHEMA , in 1 riga di codice.

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


considera in un database che hai una tabella t1. vuoi eseguire uno script su un altro database come - se esiste t1 allora non fare nient'altro per creare t1. Per fare questo apri studio visivo e fai quanto segue:

Fare clic con il tasto destro su t1, quindi su Script table as, quindi su DROP e Create To, quindi su New Query Editor

troverai la tua richiesta desiderata. Ma prima di eseguire lo script non dimenticare di commentare la dichiarazione di rilascio nella query perché non vuoi crearne una nuova se ce n'è già una.

Grazie


IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

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

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




sql-server-2000