SQLShack (Italiano)

Questo articolo passa attraverso diverse versioni dell’istruzione T-SQL IF EXISTS per il database SQL utilizzando vari esempi.

  • IF EXISTS in SQL 2014 o prima
  • DROP ..IF EXISTS in SQL Server 2016 a SQL Server 2019

Introduzione

Supponiamo di voler distribuire oggetti come tabelle, procedure, funzioni nel database SQL Server. Se si eseguono dichiarazioni CREATE per questi oggetti, e quell’oggetto esiste già in un database, si ottiene il messaggio 2714, livello 16, stato 3 messaggio di errore come mostrato di seguito.

Si può scrivere una dichiarazione DROP prima di eseguire la dichiarazione create. Funziona bene se l’oggetto esiste nel database.

Nel caso in cui l’oggetto non esista, e si tenta il drop, si ottiene il seguente errore.

Per evitare questa situazione, di solito, gli sviluppatori aggiungono l’istruzione T-SQL If Exists e rilasciano l’oggetto se è già disponibile nel database.

Diciamo che vogliamo distribuire una stored procedure ‘stpGetAllMembers’ nel database di test di SQLShack. Possiamo usare diversi metodi per controllare se la procedura esiste nel database SQL, ma interroghiamo la tabella di sistema sys.objects per trovarla.

Il seguente codice fa le seguenti cose per noi:

  • Per prima cosa, esegue l’istruzione select all’interno della IF Exists
  • Se l’istruzione select restituisce un valore che la condizione è TRUE per IF Exists
  • Inizia il codice all’interno di un’istruzione begin e stampa il messaggio

Se la procedura non esiste, non esegue il codice in una dichiarazione di inizio.

Ora, vogliamo eliminare questa procedura se esiste già nel database. Possiamo aggiungere un comando DROP PROCEDURE all’interno di una dichiarazione iniziale. Esso elimina la stored procedure se esiste già nel database.

Possiamo usare questo metodo anche con altri oggetti di SQL Server. La seguente query controlla l’esistenza della tabella SQL e la elimina se è presente.

Nell’articolo, SQL Code Snippets in Azure Data Studio, abbiamo discusso degli snippets di codice per scrivere T-SQL. Ho pensato di controllare la sintassi dello snippet sqlCreateStoredProc per una nuova stored procedure.

Per visualizzare la definizione di questo snippet, digitate create proc, premete sqlCreateStoredProc e date invio.

Come mostrato nell’immagine seguente, questo snippet utilizza anche il metodo IF EXISTS per scrivere una stored procedure.

DROP IF EXISTS statement

SQL Server 2016 fornisce un miglioramento per controllare l’esistenza dell’oggetto e abbandonarlo se esiste già. Introduce il comando DROP IF EXISTS per questo scopo.

La sintassi per DROP IF EXISTS

DROP OBJECT_TYPE OBJECT_NAME

  • Fa cadere l’oggetto se esiste già nel database SQL
  • Possiamo anche usarlo per far cadere la colonna o i vincoli
  • Se l’oggetto specificato non esiste, non dà alcun messaggio di errore. Continua l’esecuzione per il prossimo comando

Possiamo usare Database, Tabella, Funzione, Trigger, Stored Procedure, Colonna, Utente, Vista, Schema, Indice, Ruolo per questo comando.

Capiamo questa nuova clausola T-SQL IF EXISTS usando vari esempi.

DROP Stored Procedure IF EXISTS

Nell’esempio precedente, abbiamo usato DROP Stored Procedure stpGetAllMembers a scopo dimostrativo. Questa stored procedure non esiste più. Usiamo il nuovo metodo e proviamo a eliminare la stored procedure.

1
DROP PROCEDURE IF EXISTS stpGetAllMembers;

Possiamo aggiungere altro codice come le istruzioni di stampa, creare istruzioni. Il seguente codice stampa un messaggio dopo il comando DROP PROCEDURE.

1
2

DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT ‘Stored proc does not exist’

Creiamo la stored procedure usando questa nuova sintassi T-SQL IF EXISTS. La seguente query elimina la stored procedure se esiste già, nel caso non esista, ne creerà una.

1
2
3
4
5
6
7
8
9

DROP PROCEDURE IF EXISTS stpGetAllMembers;
GO
CREATE PROCEDURE stpGetAllMembers
AS
SELECT table_catalog ,
table_schema ,
table_name ,
table_type
FROM INFORMATION_SCHEMA.TABLES;

DROP View IF EXISTS

Possiamo usare la seguente query per SQL 2016 o successivi per eliminare una vista.

1
2

DROP VIEW IF EXISTS vwABC
GO

In SQL Server 2014 o versione precedente, usiamo il seguente codice. Controlla le viste usando sys.objects per il tipo V.

1
2
3
4

IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’vwABC’)
AND type = N’V’)
DROP VIEW vwABC
GO

DROP Constraint IF EXISTS

Possiamo usare il seguente comando per eliminare un vincolo UNIQUE usando l’istruzione DROP CONSTRAINT IF EXISTS.

1
2

ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO

Il seguente codice funziona in SQL 2014 o precedente. Il tipo UQ nel sys.objects si riferisce a un vincolo UNIQUE.

Per un vincolo di controllo, cambiare il tipo da UQ a C nella query della versione SQL 2014 o precedente. Non abbiamo bisogno di cambiare la query specificata usando l’istruzione DROP CONSTRAINT IF EXISTS.

DROP Table IF EXISTS

Possiamo usare l’istruzione DROP TABLE IF EXISTS per eliminare una tabella SQL anche in SQL Server 2016 o successivo.

1
2

DROP TABLE IF EXISTS DemoTable
GO

Per SQL 2014 o versioni precedenti, dobbiamo usare il metodo IF EXISTS come mostrato qui sotto. Il tipo U si riferisce a una tabella SQL definita dall’utente.

1
2
3
4

IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’DemoTable’)
AND type = N’U’)
DROP TABLE DemoTable
GO

DROP Database IF EXISTS

Possiamo usare i nuovi script T-SQL If Exists per eliminare un database SQL anche per SQL 2016 o successivi.

1
2

DROP DATABASE IF EXISTS TargetDB
GO

In alternativa, utilizzare il seguente script con SQL 2014 o versione inferiore. È valido anche nelle versioni superiori di SQL Server.

1
2
3

IF EXISTS (SELECT 1 FROM sys.database WHERE database_id = DB_ID(N’TargetDB’))
DROP DATABASE TargetDB
GO

DROP Column IF EXISTS

A volte abbiamo bisogno di eliminare una colonna da una tabella SQL. È una buona pratica anche quella di eliminare le colonne indesiderate. Risparmia sforzi per il motore SQL e migliora le prestazioni della query mentre recupera meno record per l’output.

Eliminiamo una colonna usando l’istruzione Alter Table. Possiamo sfruttare DROP COLUMN IF EXISTS anche in questa istruzione alter. Supponiamo di voler eliminare una colonna Country dalla tabella Employee. Usiamo la seguente dichiarazione di alter table.

1
2

ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO

Si tratta di una singola linea e di una query semplice. In alternativa, usiamo la seguente query usando IF Exists. Sembra essere più complicato di quello precedente. Dovremmo usare l’ultima sintassi della query con le versioni di SQL Server supportate.

Conclusione

In questo articolo, abbiamo esplorato due diverse versioni di dichiarazioni T-SQL IF Exists.

  • IF EXISTS in SQL 2014 o prima
  • DROP IF EXISTS in SQL Server 2016 o dopo

Si dovrebbe scegliere la sintassi adatta a voi. Vi consiglierei l’ultima (Drop [object[ IF Exists), se siete su SQL 2016 o versioni successive.

  • Autore
  • Post recenti
Come certificato MCSA e Microsoft Certified Trainer a Gurgaon, India, con 13 anni di esperienza, Rajendra lavora per una varietà di grandi aziende concentrandosi sull’ottimizzazione delle prestazioni, il monitoraggio, l’alta disponibilità e le strategie e l’implementazione del disaster recovery. È autore di centinaia di articoli autorevoli su SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS/Amazon RDS, Git e tecnologie correlate che sono stati visti da oltre 10 milioni di lettori fino ad oggi.
È il creatore di una delle più grandi raccolte gratuite online di articoli su un singolo argomento, con la sua serie di 50 parti su SQL Server Always On Availability Groups. Sulla base del suo contributo alla comunità di SQL Server, è stato riconosciuto con vari premi tra cui il prestigioso “Miglior autore dell’anno” continuamente nel 2020 e 2021 a SQLShack.
Raj è sempre interessato a nuove sfide quindi se avete bisogno di un aiuto di consulenza su qualsiasi argomento trattato nei suoi scritti, può essere raggiunto all’indirizzo [email protected]
Vedi tutti i post di Rajendra Gupta

Latest posts by Rajendra Gupta (see all)
  • Esecuzione di aggiornamenti di versioni minori e maggiori per AWS RDS SQL Server – 29 gennaio, 2021
  • Distribuire istanze di AWS RDS PostgreSQL – 27 gennaio 2021
  • Migrare i tuoi database SQL on-premises a AWS RDS SQL Server usando AWS DMS – 25 gennaio 2021

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *