risposta-alla-domanda-sullo-sviluppo-web-bd.com

Controlla se la tabella esiste in SQL Server

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, arretrato e 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.

995
Vincent

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

Si noti inoltre che se per qualsiasi motivo è necessario verificare la presenza di un tavolo temporaneo, è possibile farlo:

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

Usiamo sempre lo stile OBJECT_ID per tutto il tempo che ricordo

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

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/

109
BrainCoder

Alla ricerca di una tabella su un altro database:

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

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

Le viste dello schema di 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 le tabelle in esiste un altro database , senza modificare in modo dinamico [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;

SQL SERVER 2016 Modifica :

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 alle istruzioni drop. Per esempio,

drop table if exists mytablename

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

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

L'utilizzo dello Schema di informazioni è il metodo standard di SQL per farlo, quindi dovrebbe essere utilizzato da tutti i database che lo supportano.

15
Vinko Vrsalovic

Se hai bisogno di lavorare su diversi database:

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

Qui nel codice sopra, il nome della tabella è Mapping_APCToFANavigator.

10

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

Aggiungo solo qui, a beneficio degli sviluppatori e dei colleghi DBA

uno script che riceve @Tablename come parametro

(che può contenere o meno lo schemaname) e restituisce le seguenti informazioni se esiste schema.table:

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

Ho prodotto questo script per essere utilizzato all'interno di altri script ogni volta che ho bisogno di verificare se esiste una tabella o vista, e quando lo fa, ottenere il suo object_id da utilizzare per altri scopi.

Segnala un errore quando hai passato una stringa vuota, nome schema errato o nome tabella errato.

questo potrebbe essere all'interno di una procedura e restituire -1 per esempio.

Ad esempio, ho una tabella chiamata "Facts.FactBackOrder" in uno dei miei database di Data Warehouse.

Ecco come ho ottenuto questo:

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 2000 puoi provare:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
4
dipi evil
    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

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

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

2
Blauhirn

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

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'
0
user3651072

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

0
Maslow

Ho avuto alcuni problemi con la selezione da INFORMATIONAL_SCHEME e OBJECT_ID. Non so se si tratta di un problema di ODBC driver o qualcosa del genere .. Le query dello studio di gestione SQL, entrambe, erano a posto.

Ecco la soluzione:

SELECT COUNT(*) FROM <yourTableNameHere>

Pertanto, se la query non riesce, probabilmente non esiste una tabella di questo tipo nel database (o non si dispone delle autorizzazioni di accesso).

Il controllo viene eseguito confrontando il valore (numero intero nel mio caso) restituito da SQL executor che gestisce il driver ODBC.

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

Esegui questa query per verificare se la tabella esiste nel database:

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