Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

6 modi per verificare se esiste una tabella in SQL Server (esempi T-SQL)

Questo articolo offre cinque opzioni per verificare se esiste una tabella in SQL Server. La maggior parte delle opzioni prevede l'interrogazione di una vista di sistema, ma una delle opzioni esegue una procedura memorizzata di sistema e un'altra coinvolge una funzione.

Includo anche alcuni semplici IF dichiarazioni che possono essere modificate per adattarsi alle tue circostanze.

Opzione 1 – La vista sys.tables

Questa opzione interroga sys.tables vista del catalogo di sistema. Questa vista restituisce una riga per ogni tabella utente. Pertanto, puoi interrogarlo utilizzando il nome della tabella che stai verificando.

Esempio:

SELECT 
  object_id 
FROM sys.tables
WHERE name = 'Artists';

Risultato:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Puoi anche aggiungere il nome dello schema alle cose che stai controllando. Ecco come modificare la query precedente per includere il nome dello schema:

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Risultato:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Nota che il sys.tables view restituisce solo l'ID dello schema, quindi ho dovuto passarlo a SCHEMA_NAME() funzione per ottenere il suo nome. In alternativa avrei potuto utilizzare l'ID dello schema se l'avessi saputo.

Esempio:

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND schema_id = 1;

Risultato:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Opzione 2 – La procedura memorizzata sp_tables

L'opzione successiva esegue sp_tables procedura memorizzata.

Ecco quanto può essere conciso il tuo codice quando usi questo metodo:

sp_tables 'Artists'

Risultato:

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Tuttavia, questa procedura memorizzata restituisce viste oltre alle tabelle, quindi è una buona idea restringere il campo alle sole tabelle (a meno che tu non sia interessato anche alla restituzione delle viste). Per restringere il campo alle sole tabelle, usa @table_type = "'TABLE'" .

Già che ci sei, puoi anche specificare il proprietario della tabella e il qualificatore della tabella.

Esempio:

EXEC sp_tables 
  @table_name = 'Artists',  
  @table_owner = 'dbo',
  @table_qualifier = 'Music',
  @table_type = "'TABLE'",
  @fUsePattern = 1;

Risultato:

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

È importante notare che il @table_type il parametro accetta un elenco separato da virgole. Pertanto, è leggermente diverso dagli altri parametri. Il @table_type il valore deve essere racchiuso tra virgolette doppie e ogni elemento racchiuso tra virgolette singole. Nel mio esempio, c'è solo una voce di elenco, tuttavia, deve ancora essere racchiusa tra virgolette doppie e singole.

Opzione 3 – INFORMAZIONE_SCHEMA.TABLES

Il INFORMATION_SCHEMA.TABLES vista sistema restituisce una riga per ogni tabella o vista nel database corrente per cui l'utente corrente dispone delle autorizzazioni. È simile a sys.tables , ma restituisce meno colonne. Le viste dello schema di informazioni incluse in SQL Server sono conformi alla definizione standard ISO per INFORMATION_SCHEMA.

Ecco un esempio di utilizzo per verificare se esiste una tabella nel database corrente:

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists';

Risultato:

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Eccolo di nuovo, ma questa volta specifico anche lo schema:

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists'
AND TABLE_SCHEMA = 'dbo';

Risultato:

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Opzione 4 – La funzione OBJECT_ID()

Puoi anche usare una funzione come OBJECT_ID() per vedere se restituisce un valore diverso da NULL.

Esempio:

SELECT OBJECT_ID('Artists', 'U') AS Result;

Risultato:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

In questo caso, la tabella esiste. Nota che ho usato U per indicare il tipo di oggetto (tabella definita dall'utente).

Puoi anche fornire un nome in tre parti per includere il database e lo schema:

SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;

Risultato:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Se la tabella non esiste, otterrai NULL :

SELECT OBJECT_ID('Oops!', 'U') AS Result;

Risultato:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Vedi sotto per un esempio di utilizzo in un IF dichiarazione.

Opzione 5 – La vista sys.objects

Come se nessuno degli esempi precedenti funzionasse, ecco un altro modo per verificare se esiste una tabella.

Questa volta interrogo sys.objects vista del catalogo di sistema. Questa vista restituisce una riga per ogni oggetto definito dall'utente con ambito schema nel database. Non restituisce solo tabelle, restituisce tutti i tipi di oggetti. Pertanto abbiamo bisogno di restringere il campo alle sole tabelle. In questo caso mi interessano solo le tabelle definite dall'utente, quindi posso usare type = 'U' (U è per "USER_TABLE"). In alternativa, puoi usare TYPE_DESC = 'USER_TABLE' .

SELECT 
  object_id 
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists';

Risultato:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Eccolo di nuovo, ma specificando lo schema:

SELECT 
  object_id  
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Risultato:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Opzione 6 – La vista sys.sysobjects (EVITARE)

Questa opzione è elencata solo in modo che io possa sconsigliarne l'uso. Il sys.sysobjects la vista è inclusa in SQL Server per la compatibilità con le versioni precedenti e Microsoft consiglia di evitare di utilizzare questa vista in lavori futuri.

Se incontri codice che utilizza questa visualizzazione, valuta la possibilità di modificarlo per utilizzare sys.objects o qualche altra vista di sistema o procedura memorizzata.

In ogni caso, ecco come potrebbe apparire l'esempio precedente se si utilizza sys.sysobjects invece di sys.objects .

SELECT
  id  
FROM sys.sysobjects 
WHERE xtype = 'U' 
AND name = 'Artists';

Risultato:

+-----------+
| id        |
|-----------|
| 885578193 |
+-----------+

Dichiarazione IF 1

Ecco un semplice IF istruzione che verifica l'esistenza della tabella, quindi stampa un messaggio diverso a seconda del risultato. Questo codice può essere modificato per soddisfare le tue esigenze specifiche.

IF EXISTS 
  (SELECT object_id FROM sys.tables
  WHERE name = 'Artists'
  AND SCHEMA_NAME(schema_id) = 'dbo')
  PRINT 'The table exists'
ELSE 
  PRINT 'The table does not exist';

Risultato:

The table exists

Ed ecco come appare quando il tavolo non esiste:

IF EXISTS 
  (SELECT object_id FROM sys.tables
  WHERE name = 'Customer'
  AND SCHEMA_NAME(schema_id) = 'dbo')
  PRINT 'The table exists'
ELSE 
  PRINT 'The table does not exist';

Risultato:

The table does not exist

Dichiarazione IF 2

Ecco un altro IF dichiarazione che può essere modificata per soddisfare le tue esigenze specifiche.

IF OBJECT_ID('Artists', 'U') IS NOT NULL  
  PRINT 'The table exists'
ELSE 
  PRINT 'The table does not exist';

Risultato:

The table exists