Aggiornamento gennaio 2017 - SQL Server 2016+ / Database SQL di Azure
SQL Server 2016 e la versione corrente del database SQL di Azure ora hanno la sintassi seguente per funzioni, procedure, tabelle, database, ecc. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
E SQL Server 2016 Service Pack 1 aggiunge funzionalità ancora migliori per i moduli (funzioni, procedure, trigger, viste), il che significa che non si perdono autorizzazioni o dipendenze ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Entrambi questi miglioramenti della sintassi possono portare a script molto più semplici utilizzati per il controllo del codice sorgente, le distribuzioni, ecc.
Ma se stai usando ...
Versioni precedenti
Devi fare ciò che fa SQL Server quando esegui lo script da Management Studio:
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE type = 'FN' AND name = 'fn_myfunc')
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE FUNCTION ...';
EXEC sp_executesql @sql;
END
Oppure puoi dire:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Oppure puoi semplicemente dire:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Qui verrà visualizzato un messaggio di errore se la funzione non esiste già, ma lo script continuerà dal GO successivo, quindi, indipendentemente dal fatto che il drop abbia funzionato o meno, la funzione verrà comunque (ri) creata.)
Se si elimina la funzione e la si ricrea, si perderanno anche le autorizzazioni e le informazioni sulla dipendenza potenziale.