SQLShack (Português)

Este artigo percorre diferentes versões do T-SQL IF EXISTS statement for the SQL database using various examples.

  • IF EXISTS in SQL 2014 ou antes
  • DROP ..IF EXISTS in SQL Server 2016 to SQL Server 2019

Introduction

Suponhamos que se pretende implementar objectos tais como tabelas, procedimentos, funções na base de dados do SQL Server. Se executar declarações CREATE para estes objectos, e esse objecto já existir numa base de dados, recebe a mensagem 2714, nível 16, estado 3 mensagem de erro como se mostra abaixo.

Pode escrever uma declaração DROP antes de executar a declaração de criação. Funciona bem se o objecto existir na base de dados.

No caso de o objecto não existir, e se tentar abandonar, obtém o seguinte erro.

Para evitar esta situação, normalmente, os programadores adicionam T-SQL If Exists statement e deixam cair o objecto se este já estiver disponível na base de dados.

Digamos que desejamos implementar um procedimento armazenado ‘stpGetAllMembers’ na base de dados de teste SQLShack. Podemos utilizar múltiplos métodos para verificar se o procedimento existe na base de dados SQL, mas vamos consultar a tabela do sistema sys.objects para o efeito.

O seguinte código faz-nos as coisas abaixo:

  • Primeiro, executa o comando select dentro do IF Existente
  • Se o comando select retorna um valor essa condição é VERDADEIRA para IF Existente
  • Inicia o código dentro de um comando begin e imprime a mensagem

Se o procedimento não existir, não executa o código numa declaração de início.

Agora, queremos abandonar este procedimento se ele já existir na base de dados. Podemos adicionar um comando DROP PROCEDURE dentro de uma declaração de início. Desiste do procedimento armazenado se este já existir na base de dados.

Podemos usar este método também com outros objectos do SQL Server. A consulta seguinte verifica a existência da tabela SQL e deixa-a cair se ela já existir.

No artigo, SQL Code Snippets in Azure Data Studio, discutimos trechos de código para escrever T-SQL. Pensei em verificar a sintaxe do snippet sqlCreateStoredProc para um novo procedimento armazenado.

Para ver esta definição de snippet, digite create proc, prima o sqlCreateStoredProc e entre.

Como mostra a imagem seguinte, este snippet também usa o método IF EXISTS para escrever um procedimento armazenado.

DROP IF EXISTS statement

SQL Server 2016 fornece um melhoramento para verificar a existência do objecto e deixar cair se este já existir. Introduz o comando DROP IF EXISTS para este fim.

A sintaxe para DROP IF EXISTS

DROP OBJECT_TYPE OBJECT_NAME

  • Deixa cair o objecto se já existir na base de dados SQL
  • Podemos também utilizá-lo para deixar cair a coluna ou restrições
  • Se o objecto especificado não existir, não dá qualquer mensagem de erro. Continua a execução para o próximo comando

Podemos utilizar Base de Dados, Tabela, Função, Gatilho, Procedimento Armazenado, Coluna, Utilizador, Vista, Esquema, Índice, Função para este comando.

Vamos compreender esta nova cláusula do T-SQL SE EXISTS utilizando vários exemplos.

DROP Stored Procedure IF EXISTS

No exemplo anterior, utilizámos o DROP Stored Procedure stpGetAllMembers para fins de demonstração. Este procedimento armazenado não existe agora. Vamos usar o novo método e tentar abandonar o procedimento armazenado.

1
DROP PROCEDURE IF EXISTS stpGetAllMembers;

Podemos adicionar mais códigos, tais como declarações impressas, criar declarações. O seguinte código imprime uma mensagem após o comando DROP PROCEDURE.

1
2

DROP PROCEDIMENTO SE EXISTE stpGetAllMembers
PRINT ‘Stored proc does not exist’

Vamos criar o procedimento armazenado usando esta nova sintaxe T-SQL SE EXISTE comando. A consulta seguinte deixa de ser o procedimento armazenado se este já existir, caso não exista, criará um.

>>

PROCEDIMENTO DE PROCEDIMENTO DE Gotas SE EXISTEM stpGetAllMembers;
GO
CRIAR PROCEDIMENTO stpGetAllMembers
AS
SELECT table_catalog ,
table_schema ,
table_name ,
table_type
FROM INFORMATION_SCHEMA.TABELAS;
1
2
3
4
5
6
7
8
9

DROP View IF EXISTS

Podemos usar a seguinte consulta para SQL 2016 ou posterior para deixar cair uma vista.

1
2

DROP VIEW IF EXISTS vwABC
GO

No SQL Server 2014 ou versão anterior, utilizamos o seguinte código. Ele verifica as vistas usando sys.objects para o tipo V.

SE EXISTE (SELECT 1 FROM sys.objectos WHERE object_id = OBJECT_ID(N’vwABC’)
AND type = N’V’)
DROP VIEW vwABC
GO

1
2
3
4

DROP Constraint IF EXISTS

Podemos usar o seguinte comando para abandonar uma restrição UNIQUE usando a declaração DROP CONSTRAINT IF EXISTS.

1
2

TABELA ALTER DEMOTADORAÇÃO DO CONSTRATÓRIO DE PRODUTOS SE EXISTEM VÁRIO
GO

O seguinte código funciona em SQL 2014 ou antes. O tipo UQ no sys.objects refere-se a uma restrição UNIQUE.

Para uma restrição de verificação, alterar o tipo de UQ para C no SQL 2014 ou antes da consulta da versão. Não precisamos de alterar a consulta especificada usando a instrução DROP CONSTRAINT IF EXISTS.

DROP Table IF EXISTS

Podemos usar a instrução DROP TABLE IF EXISTS para largar uma tabela SQL também no SQL Server 2016 ou posterior.

1
2

TABELA DE PRODUTOS SE EXISTEM Tabela DemoTable
GO

Para SQL 2014 ou versões anteriores, precisamos de utilizar o método SE EXISTIR, como se mostra abaixo. O tipo U refere-se a uma tabela SQL definida pelo utilizador.

SE EXISTE (SELECT 1 FROM sys.objectos WHERE object_id = OBJECT_ID(N’DemoTable’)
AND type = N’U’)
DROP TABLE DemoTable
GO

1
2
3
4

DROP Database IF EXISTS

Podemos usar o novo T-SQL Se existirem scripts para deixar cair uma base de dados SQL também para SQL 2016 ou posterior.

1
2

DROP DATABASE IF EXISTS TargetDB
GO

Em alternativa, utilizar o seguinte guião com SQL 2014 ou versão inferior. Também é válido nas versões superiores do SQL Server.

1
2
3

SE EXISTE (SELECT 1 FROM sys.bases de dados WHERE database_id = DB_ID(N’TargetDB’))
DROP DATABASE TargetDB
GO

Coluna DROP SE EXISTIR

Por vezes exigimos que se largue uma coluna de uma tabela SQL. É também uma boa prática largar também colunas indesejadas. Poupa esforços para o motor SQL e melhora o desempenho da consulta ao mesmo tempo que recupera menos registos para a saída.

Deixamos cair uma coluna utilizando a instrução Alter Table. Podemos tirar partido da COLUNA DE Gotas SE EXISTE também nesta instrução de alteração. Suponhamos que queremos largar uma coluna de País da tabela de Empregados. Utilizamos a seguinte declaração de alteração da tabela.

1
2

TABELA ALTERA COLUNA DE GOLUNA DO TRABALHADOR SE EXISTE País
GO

É uma linha única e uma consulta simples. Alternativamente, utilizamos a seguinte consulta usando SE EXISTE. Parece ser mais complicada do que a anterior. Devemos usar a última sintaxe de consulta com as versões suportadas do SQL Server.

Conclusion

Neste artigo, explorámos duas versões diferentes de T-SQL IF Exists statements.

  • IF EXISTS em SQL 2014 ou antes
  • DROP IF EXISTS em SQL Server 2016 ou depois

Deve escolher a sintaxe adequada para si. Eu recomendaria a mais recente (DROP [object[ IF Exists), se estiver em SQL 2016 ou versões posteriores.

  • Autor
  • Posts recentes
Como um formador certificado MCSA e Microsoft Certified Trainer em Gurgaon, Índia, com 13 anos de experiência, a Rajendra trabalha para uma variedade de grandes empresas concentrando-se na optimização do desempenho, monitorização, alta disponibilidade, e estratégias e implementação de recuperação de desastres. É autor de centenas de artigos de autor sobre SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS/Amazon RDS, Git, e tecnologias relacionadas que têm sido vistas por mais de 10m leitores até à data.
Ele é o criador de uma das maiores colecções online gratuitas de artigos sobre um único tópico, com as suas séries de 50 partes em SQL Server Always On Availability Groups. Com base na sua contribuição para a comunidade SQL Server, foi reconhecido com vários prémios, incluindo o prestigiado “Melhor autor do ano” continuamente em 2020 e 2021 na SQLShack.
Raj está sempre interessado em novos desafios, por isso se precisar de ajuda de consultoria sobre qualquer assunto abordado nos seus escritos, pode ser contactado em [email protected]
Ver todos os posts de Rajendra Gupta

Latest posts de Rajendra Gupta (ver todos)
  • Realizar actualizações de versões menores e maiores para AWS RDS SQL Server – 29 de Janeiro, 2021
  • Implementar instâncias AWS RDS PostgreSQL – 27 de Janeiro de 2021
  • Migrando as suas bases de dados SQL no local para AWS RDS SQL Server usando AWS DMS – 25 de Janeiro de 2021

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *