T-SQL non include IF NOT EXISTS
clausola con il suo CREATE TABLE
istruzione, come fanno altri DBMS.
Pertanto, se vogliamo verificare l'esistenza della tabella prima di crearla in SQL Server, dobbiamo utilizzare altri metodi.
Opzione 1:controlla l'ID oggetto
In SQL Server possiamo usare OBJECT_ID()
funzione per verificare l'esistenza della tabella prima di provare a crearla:
IF OBJECT_ID(N'dbo.t1', N'U') IS NULL
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
GO
L'esempio sopra controlla l'ID oggetto per un dbo.t1
tabella.
Il secondo argomento per OBJECT_ID()
specifica il tipo di oggetto che stiamo cercando. In questo caso utilizziamo U
, che sta per "tabella definita dall'utente".
Il OBJECT_ID()
restituisce il numero di identificazione dell'oggetto database di un oggetto con ambito schema. Se l'oggetto non esiste o se non hai accesso ad esso, la funzione restituisce NULL. Pertanto, possiamo verificare un valore NULL e creare la tabella solo se questa funzione restituisce NULL.
Possiamo usare il OBJECT_ID()
funzione per controllare l'ID oggetto della tabella una volta creata:
SELECT OBJECT_ID(N'dbo.t1', N'U');
Esempio di risultato:
354100302
Se volessimo qualche informazione in più, potremmo fare qualcosa del genere:
sp_tables 't1';
Risultato:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | KrankyKranes | dbo | t1 | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Qui, KrankyKranes
è il database in cui ho creato la tabella.
Ci sono molti altri modi per guardare le tabelle esistenti. Vedere 6 modi per verificare se una tabella esiste in SQL Server per esempi.
Opzione 2:interroga sys.tables
Un altro modo per verificare se una tabella esiste già è interrogare sys.tables
vista catalogo di sistema.
Esempio:
IF NOT EXISTS (
SELECT * FROM sys.tables t
JOIN sys.schemas s ON (t.schema_id = s.schema_id)
WHERE s.name = 'dbo' AND t.name = 't1')
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
Ciò fa una cosa simile all'esempio precedente; verifica l'esistenza della tabella e la crea solo se non esiste.
Indipendentemente dal metodo utilizzato per verificare l'esistenza della tabella, il comando viene completato correttamente, indipendentemente dal fatto che la tabella esista o meno.
Quindi otteniamo il seguente output da entrambi i metodi:
Commands completed successfully.
Ricevo quel messaggio se la tabella esisteva già o meno.
Se la tabella esiste già, ma non controlliamo l'esistenza della tabella, viene visualizzato un errore come questo:
Msg 2714, Level 16, State 6, Line 1 There is already an object named 't1' in the database.
È importante notare che, solo perché una tabella con quel nome esiste già nel database, non significa che abbia la definizione corretta. I metodi precedenti controllano semplicemente la tabella per nome e schema.