Atualização de janeiro de 2017 - SQL Server 2016+ / Banco de Dados SQL do Azure
O SQL Server 2016 e a versão atual do Banco de Dados SQL do Azure agora têm a seguinte sintaxe para funções, procedimentos, tabelas, bancos de dados etc. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
E o SQL Server 2016 Service Pack 1 adiciona funcionalidades ainda melhores aos módulos (funções, procedimentos, gatilhos, exibições), o que significa que não há perda de permissões ou dependências ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Ambos os aprimoramentos de sintaxe podem levar a scripts muito mais simples usados para controle de origem, implantações etc.
Mas, se você estiver usando ...
versões mais antigas
Você precisa fazer o que o SQL Server faz ao criar um script no 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 você pode dizer:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Ou você pode apenas dizer:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Aqui você receberá uma mensagem de erro se a função ainda não existir, mas o script continuará a partir do próximo GO, portanto, se a queda funcionou ou não, a função ainda será (re) criada.)
Observe que, se você soltar a função e recriá-la, também perderá permissões e informações potencialmente sobre dependência.