Estou usando o sql server 2012:
Gostaria de fazer o script da criação de um objeto (se ele não existir primeiro) e depois alterá-lo.
Estou tentando evitar o drop/create usual, pois isso afetaria as estatísticas. Também tem a ver com a forma como estamos roteirizando as alterações no banco de dados.
O que eu tenho:
Go
If object_id(N'My_Function', N'FN') IS NULL
Begin
Create Function My_Function
(
@SomeParameter int
)
Returns int
As
Begin
-- Intentionally empty
End
End
Go
-- A header/comments
Alter Function My_Function
(
@SomeParameter int
)
Returns int
As
Begin
Declare @returnValue int
-- A bunch of sql code
Return @returnValue
End
Go
O problema que estou tendo é que "Create" deve ser o primeiro no script (ou primeiro depois de um "GO"), mas não consigo colocar um "GO" dentro de uma condicional "If". Existe uma maneira de criar algo condicionalmente se não existir e depois alterá-lo mais tarde?
Você não pode colocar
CREATE FUNCTION
dentroIF
da lógica, pois ela precisa estar em seu próprio lote.Eu faria desta forma. Se a função ainda não existir, crie um stub vazio. Agora você sempre pode emitir um alter com segurança.
Infelizmente, não conheço nenhuma maneira fácil de fazer com que o SSMS faça o script dessa maneira para você, e mesmo fazer isso por meio do SMO ou de outros métodos será uma dor IMHO. Simplesmente porque a função tem que ser do mesmo tipo (IF, TVF, MSTVF), então seu stub simples não pode ser sempre o mesmo.
Não seria ótimo se o SQL Server tivesse suporte
CREATE OR REPLACE
?