Molte volte ci imbattiamo in uno scenario in cui è necessario eseguire del codice in base all’esistenza o meno di una tabella. Esistono diversi modi per identificare l’esistenza della tabella in Sql Server, in questo articolo verranno elencati i diversi approcci che sono comunemente usati ed è pro e contro. Preferisco usare la funzione OBJECT_ID () in quanto è facile da ricordare. Fammi sapere quale approccio usi e ragiona per lo stesso.
Per dimostrare questi diversi approcci creiamo un database di esempio con una tabella con lo script seguente:
CREATE DATABASE SqlHintsDemoDBGOUSE SqlHintsDemoDBGOCREATE TABLE dbo.Customers (CustId INT, Name NVARCHAR(50))
Come verificare se la tabella temporanea esiste in Sql Server?
Approccio 1: utilizzo di INFORMATION_SCHEMA.Vista TABELLE
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
RISULTATO:
La query precedente controlla l’esistenza della tabella dei clienti in tutti gli schemi nel database corrente. Invece di questo se si desidera verificare l’esistenza della tabella in uno schema specificato e il database specificato, possiamo scrivere la query sopra come di seguito:
IF EXISTS (SELECT * FROM SqlHintsDemoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
RISULTATO:
Pro di questo approccio: Le viste INFORMATION_SCHEMA sono portabili su diversi sistemi RDBMS, quindi il porting su diversi RDBMS non richiede alcuna modifica.
Come verificare se esiste una Stored Procedure in Sql Server
Approccio 2: Utilizzo della funzione OBJECT_ID ()
Possiamo utilizzare la funzione OBJECT_ID() come di seguito per verificare se esiste una tabella Clienti nel database corrente.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
RISULTATO:
Specificare il nome del database e le parti del nome dello schema per il nome della tabella è facoltativo. Tuttavia, specificare il nome del database e il nome dello schema fornisce un’opzione per verificare l’esistenza della tabella nel database specificato e all’interno di uno schema specificato, invece di controllare il database corrente in tutti gli schemi. La query seguente mostra che anche se il database corrente è database MASTER, possiamo verificare l’esistenza della tabella Customers nello schema dbo nel database SqlHintsDemoDB.
USE MASTERGOIF OBJECT_ID(N'SqlHintsDemoDB.dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
RISULTATO:
Pro: Facile da ricordare. Un altro punto notevole da menzionare sulla funzione OBJECT_ID() è: fornisce un’opzione per verificare l’esistenza della tabella temporanea creata nel contesto di connessione corrente. Tutti gli altri approcci controllano l’esistenza della tabella temporanea creata in tutto il contesto delle connessioni invece del solo contesto di connessione corrente. Al di sotto di query viene illustrato come verificare l’esistenza di una Tabella Temporanea mediante OBJECT_ID() funzione:
CREATE TABLE #TempTable(ID INT)GOIF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'ENDGO
RISULTATO:
Come verificare se esiste un Database in Sql Server
Approccio 3: usare sys.Oggetti Vista catalogo
Possiamo usare il Sys.Vista catalogo oggetti 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
RISULTATO
Come verificare se esiste un record in una tabella
Approccio 4: Utilizzo di sys.Tabelle Vista catalogo
Possiamo usare il Sys.Tabelle vista catalogo 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
RISULTATO
Sys.La vista catalogo tabelle eredita le righe dal sistema.Vista catalogo oggetti, Sys.la vista catalogo oggetti viene indicata come vista base dove come sys.Tabelle viene indicato come vista derivata. Sys.Le tabelle restituiranno le righe solo per gli oggetti della tabella mentre Sys.Vista oggetto oltre a restituire le righe per gli oggetti tabella, restituisce righe per gli oggetti come: stored procedure,viste ecc.
Come verificare se esiste una VISTA in Sql Server
Approccio 5: evitare l’uso di sys.sysobjects Tabella di sistema
Dovremmo evitare di usare sys.sysobjects System Table direttamente, l’accesso diretto ad esso sarà deprecato in alcune versioni future di Sql Server. Come da Microsoft BOL link, Microsoft suggerisce di utilizzare il catalogo viste sys.oggetti/sys.tabelle invece di sys.tabella di sistema sysobjects direttamente.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')BEGIN PRINT 'Table Exists'END
RISULTATO:
:
Come verificare se esiste un database
Come verificare se esiste una Stored Procedure in Sql Server
Come verificare se esiste una vista
Come verificare se esiste una tabella temporanea
Come verificare se esiste un record nella tabella