Mise à jour de janvier 2017 - SQL Server 2016+ / Azure SQL Database
SQL Server 2016 et la version actuelle d'Azure SQL Database ont désormais la syntaxe suivante pour les fonctions, procédures, tables, bases de données, etc. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
Et SQL Server 2016 Service Pack 1 ajoute des fonctionnalités encore meilleures pour les modules (fonctions, procédures, déclencheurs, vues), ce qui signifie aucune perte d'autorisations ou de dépendances ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Ces deux améliorations de la syntaxe peuvent conduire à des scripts beaucoup plus simples utilisés pour le contrôle des sources, les déploiements, etc.
Mais si vous utilisez ...
Versions plus anciennes
Vous devez faire ce que fait SQL Server lorsque vous créez un script à partir de 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
Ou vous pouvez dire:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Ou vous pouvez simplement dire:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Ici, vous obtiendrez un message d'erreur si la fonction n'existe pas déjà, mais le script continuera à partir du prochain GO, donc que la suppression ait fonctionné ou non, la fonction sera toujours (re) créée.)
Notez que si vous supprimez la fonction et la recréez, vous perdrez également les autorisations et potentiellement les informations de dépendance.