Actualización de enero de 2017 - SQL Server 2016+ / Azure SQL Database
SQL Server 2016 y la versión actual de Azure SQL Database ahora tienen la siguiente sintaxis para funciones, procedimientos, tablas, bases de datos, etc. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
Y SQL Server 2016 Service Pack 1 agrega una funcionalidad aún mejor para los módulos (funciones, procedimientos, disparadores, vistas), lo que significa que no se pierden permisos ni dependencias ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Ambas mejoras de sintaxis pueden conducir a secuencias de comandos mucho más simples que se utilizan para el control de origen, implementaciones, etc.
Pero, si estás usando ...
versiones anteriores
Debe hacer lo que hace SQL Server cuando escribe esto desde 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
O puedes decir:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
O simplemente puedes decir:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Aquí recibirá un mensaje de error si la función aún no existe, pero la secuencia de comandos continuará desde el próximo GO, por lo que si la caída funcionó o no, la función aún se volverá a crear).
Tenga en cuenta que si suelta la función y la vuelve a crear, también perderá permisos e información de dependencia potencial.