In SQL Server, se provi a eliminare un oggetto che non esiste, riceverai un errore. Se non vuoi ricevere un errore, dovrai aggiungere del codice extra per verificare l'esistenza dell'oggetto.
Prima di SQL Server 2016, era necessario aggiungere un IF
istruzione che ha interrogato gli oggetti di sistema rilevanti per scoprire se l'oggetto esisteva o meno.
Da SQL Server 2016 è ora possibile utilizzare un nuovo metodo più pulito per verificare se esiste un oggetto. Lo chiameremo DROP IF EXISTS
(altrimenti noto come "DIE").
Esempio 1 – Sintassi di base
La sintassi in realtà non contiene il DROP IF EXISTS
stringa così com'è. Quello che devi fare è inserire il tipo di oggetto tra DROP
e IF
.
DROP TABLE IF EXISTS Customers
In questo caso, sto eliminando una tabella, quindi la parola TABLE
è inserito tra DROP
e IF
. Il nome della tabella che voglio eliminare (in questo caso Clienti ) viene posizionato alla fine.
Esempio 2 – Demo di base
Ecco un esempio di creazione di un database, quindi eliminazione, quindi tentativo di eliminazione di nuovo.
CREATE DATABASE Homer; GO DROP DATABASE IF EXISTS Homer; GO DROP DATABASE IF EXISTS Homer; GO
Risultato:
Started executing query at Line 17 Commands completed successfully. Started executing query at Line 19 Commands completed successfully. Started executing query at Line 21 Commands completed successfully.
Non si verificano errori, anche se provo a rilasciare un oggetto inesistente sulla terza riga.
Esempio 3 – Senza SE ESISTE
Eccolo di nuovo, tranne che questa volta rimuovo il IF EXISTS
parte.
CREATE DATABASE Homer; GO DROP DATABASE Homer; GO DROP DATABASE Homer; GO
Risultato:
Started executing query at Line 17 Commands completed successfully. Started executing query at Line 19 Commands completed successfully. Started executing query at Line 21 Msg 3701, Level 11, State 1, Line 5 Cannot drop the database 'Homer', because it does not exist or you do not have permission.
In questo caso ricevo un errore, perché sta tentando di eliminare un oggetto che non esiste.
Esempio 4 – Colonne e vincoli
Puoi anche utilizzare DIE su colonne e vincoli.
Ad esempio, puoi utilizzare DROP COLUMN IF EXISTS
all'interno del tuo ALTER TABLE
dichiarazione.
Ecco un esempio.
DROP TABLE IF EXISTS DieTest; GO CREATE TABLE DieTest ( DieTestId uniqueidentifier NOT NULL DEFAULT NEWID(), DieTestName varchar(70), InsertDate datetime2(7) NOT NULL DEFAULT GETDATE() ); GO ALTER TABLE DieTest DROP COLUMN IF EXISTS DieTestName; GO ALTER TABLE DieTest DROP COLUMN IF EXISTS DieTestName; GO
Risultato:
Started executing query at Line 1 Commands completed successfully. Started executing query at Line 3 Commands completed successfully. Started executing query at Line 11 Commands completed successfully. Started executing query at Line 15 Commands completed successfully.
Esempio 5:prima di SQL Server 2016
Prima di SQL Server 2016, per verificare l'esistenza di un oggetto, avresti bisogno di fare qualcosa del genere:
IF DB_ID('Homer') IS NOT NULL DROP DATABASE Homer;
Quell'esempio usa DB_ID()
perché abbiamo a che fare con un database. Se l'oggetto era di un tipo diverso, potrebbe essere necessario utilizzare OBJECT_ID()
funzione o qualcos'altro.
Ad esempio:
IF OBJECT_ID('dbo.Customers, 'U') IS NOT NULL DROP TABLE dbo.Customers; IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'MyTrigger') DROP TRIGGER MyTrigger
Una volta che iniziamo a guardare questo codice, possiamo capire perché DROP IF EXISTS
è una gradita aggiunta alla sintassi T-SQL.
Oggetti idonei
DIE può essere utilizzato sui seguenti oggetti.
AGGREGATO | PROCEDURA | TAVOLA |
MONTAGGIO | RUOLO | TRIGGER |
VISUALIZZA | REGOLA | TIPO |
BANCA DATI | SCHEMA | UTENTE |
PREDEFINITO | POLITICA DI SICUREZZA | VISUALIZZA |
FUNZIONE | SEQUENZA | |
INDICE | SINONIMI |
Come accennato, DIE può essere utilizzato anche su colonne e vincoli quando si utilizza ALTER TABLE
dichiarazione:
- ALTER TABLE DROP COLONNA SE ESISTE
- ALTER TABLE DROP CONSTRAINT SE ESISTE