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

Crea un oggetto DIE in SQL Server

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