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