Eu tenho um script SQL que precisa ser executado sempre que um cliente executa a funcionalidade "gerenciamento de banco de dados". O script inclui a criação de procedimentos armazenados no banco de dados do cliente. Alguns desses clientes já podem ter o procedimento armazenado na execução do script, e outros podem não ter. Eu preciso que os procedimentos armazenados ausentes sejam adicionados ao banco de dados do cliente, mas não importa o quanto eu tente dobrar a sintaxe do T-SQL, recebo
CREATE / ALTER PROCEDURE 'deve ser a primeira instrução em um lote de consulta
Eu li isso antes de criar trabalhos, mas não gosto de fazer dessa maneira.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Como posso adicionar a verificação da existência de um procedimento armazenado e criá-lo se ele não existir, mas alterá-lo se ele existir?
fonte
Respostas:
Você pode executar código de procedimento em qualquer lugar em que possa executar uma consulta.
Basta copiar tudo depois
AS
:Esse código faz exatamente as mesmas coisas que um procedimento armazenado faria, mas não é armazenado no lado do banco de dados.
Isso é muito parecido com o que é chamado de procedimento anônimo
PL/SQL
.Atualizar:
O título da sua pergunta é um pouco confuso.
Se você só precisar criar um procedimento, se ele não existir, seu código estará correto.
Aqui está o que
SSMS
sai no script de criação:Atualizar:
Exemplo de como fazer isso ao incluir o esquema:
No exemplo acima, dbo é o esquema.
Atualizar:
No SQL Server 2016 ou superior, você pode fazer
CREATE OR ALTER PROCEDURE dbo.MyProc
fonte
@astander
: você também pode chamar código anônimo a partir dos procedimentos armazenados. Para usar a saída deles em um arquivoINSERT
, você precisará usarOPENROWSET
ouOPENQUERY
que funcione com o código anônimo também. É claro que existem desvantagens no código anônimo: por exemplo, ele é executado apenas sob os privilégios do chamador. Meu ponto é que é possível caminho, não preferido de fazer as coisas :)Sei que isso já foi marcado como respondido, mas costumávamos fazer assim:
Apenas para evitar a interrupção do procedimento.
fonte
GRANT
explicitamente as instruções no script , caso elas mudem ; então ainda há justificativa para usar emDROP
vez deALTER
.Se você está procurando a maneira mais simples de verificar a existência de um objeto de banco de dados antes de removê-lo, aqui está uma maneira (o exemplo usa um SPROC, exatamente como o exemplo acima, mas pode ser modificado para tabelas, índices, etc ...):
Isso é rápido e elegante, mas você precisa ter nomes de objetos exclusivos em todos os tipos de objetos, pois isso não leva isso em consideração.
Eu espero que isso ajude!
fonte
Sei que você deseja "alterar um procedimento, se ele existir, e excluí-lo somente se ele não existir", mas acredito que é mais simples sempre largar o procedimento e recriá-lo. Veja como descartar o procedimento apenas se ele já existir:
O segundo parâmetro diz
OBJECT_ID
que olhar somente para objetos comobject_type = 'P'
, procedimentos que são armazenados:Você pode obter a lista completa de opções em:
fonte
A partir do SQL SERVER 2016, você pode usar o novo
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Referência: https://msdn.microsoft.com/en-us/library/ms174969.aspx
fonte
Sei que é uma postagem muito antiga, mas como ela aparece nos principais resultados da pesquisa, adicionamos a atualização mais recente para aqueles que usam o SQL Server 2016 SP1 -
Isso cria um Procedimento Armazenado, se ainda não existir, mas o altera, se existir.
Referência
fonte
DROP IF EXISTS é um novo recurso do SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
fonte
Eu tive o mesmo erro. Eu sei que esse segmento já está praticamente morto, mas quero definir outra opção além de "procedimento anônimo".
Eu resolvi assim:
Verifique se o procedimento armazenado existe:
No entanto, o
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
ainda está lá. Eu resolvi assim:Termino com este código:
fonte
Aqui está um método e algumas razões para usá-lo dessa maneira. Não é tão bonito editar o processo armazenado, mas existem prós e contras ...
ATUALIZAÇÃO: Você também pode agrupar toda a chamada em uma TRANSAÇÃO. Incluindo muitos procedimentos armazenados em uma única transação que podem confirmar ou reverter todos. Outra vantagem do agrupamento em uma transação é que o procedimento armazenado sempre existe para outras conexões SQL, desde que elas não usem o nível de isolamento de transação READ UNCOMMITTED!
1) Evitar alterações apenas como uma decisão de processo. Nossos processos devem sempre SE EXISTIR GOTAR ENTÃO CRIAR. Se você adotar o mesmo padrão de suposição de que o novo PROC é o proc desejado, a restauração de alterações é um pouco mais difícil, porque você teria uma opção SE EXISTS ALTER ELSE CREATE.
2) Você deve colocar CREATE / ALTER como a primeira chamada em um lote, para não poder agrupar uma sequência de atualizações de procedimentos em uma transação fora do SQL dinâmico. Basicamente, se você deseja executar uma pilha inteira de atualizações de procedimentos ou reverter todas elas sem restaurar um backup do banco de dados, essa é uma maneira de fazer tudo em um único lote.
fonte
No servidor Sql 2008 em diante, você pode usar "
INFORMATION_SCHEMA.ROUTINES
"fonte
Aparentemente, não tenho a reputação necessária para votar ou comentar, mas só queria dizer que a resposta de Geoff usando EXEC (sp_executesql pode ser melhor) é definitivamente o caminho a percorrer. Descartar e depois recriar o procedimento armazenado faz o trabalho no final, mas há um momento em que o procedimento armazenado não existe, e isso pode ser muito ruim, especialmente se isso for algo que será necessário. execute repetidamente. Eu estava tendo todos os tipos de problemas com meu aplicativo porque um thread em segundo plano estava executando um IF EXISTS DROP ... CREATE ao mesmo tempo em que outro thread tentava usar o procedimento armazenado.
fonte
** A maneira mais simples de descartar e recriar um processo armazenado no T-Sql é **
fonte
Aqui está o script que eu uso. Com isso, evito eliminar e recriar desnecessariamente os procs armazenados.
fonte
Verifique se existe algum procedimento armazenado
Verifique se existe para acionar, função também clicando no link abaixo http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
fonte
por que você não segue o caminho mais simples como
..........
fonte
%
, então oLIKE
comportamento se comporta como=
Além da resposta de @Geoff , criei uma ferramenta simples que gera um arquivo SQL com instruções para procedimentos armazenados, exibições, funções e acionadores.
Veja MyDbUtils @ CodePlex .
fonte
Eu me pergunto! Por que não escrevo toda a consulta como
Eu já sei que os dois primeiros procedimentos já existem O sql executará a consulta dará o erro dos dois primeiros procedimentos, mas ainda assim criará o último procedimento O SQl está cuidando do que já existe, é isso que eu sempre faço para todos os meus clientes!
fonte
Procedimento CREATE SE NÃO EXISTE 'Your proc-name' () BEGIN ... END
fonte