Como descartar uma tabela se ela existir?

721

O nome da tabela é Scores.

É correto fazer o seguinte?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores
tmaster
fonte

Respostas:

1377

É correto fazer o seguinte?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores

Não. Isso eliminará a tabela apenas se contiver alguma linha (e gerará um erro se a tabela não existir).

Em vez disso, para uma tabela permanente, você pode usar

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
  DROP TABLE dbo.Scores; 

Ou, para uma tabela temporária, você pode usar

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

O SQL Server 2016 ou posterior tem uma maneira melhor de usar DROP TABLE IF EXISTS …. Veja a resposta de @Jovan .

Martin Smith
fonte
137
Fwiw - O 'U'para o segundo parâmetro aparentemente significa "Procure apenas objetos com esse nome que sejam tabelas". Uma fonte . Portanto, OBJECT_ID('TableName')não está errado , mas também não é incrivelmente preciso, portanto, 'U'na excelente resposta de @ Martin.
Ruffin
7
Em relação ao segundo parâmetro; aqui está outra fonte , usei 'V' para uma visualização.
The Red Pea
4
Oi, você pode me explicar o que esse segundo parâmetro significa em OBJECT_ID ('tempdb.dbo. # T', 'U'), por exemplo, esse 'U'?
Zvonimir Tokic
9
@ZvonimirTokic significa "Tabela definida pelo usuário". "TI" seria uma tabela interna, definida pelo sistema. A lista completa está aqui msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
375

No SQL Server 2016, você pode usar

DROP TABLE IF EXISTS dbo.Scores

Referência: DROP IF EXISTS - novidade no SQL Server 2016

Em breve, ele estará no Banco de Dados SQL Azure.

Jovan MSFT
fonte
151

A maneira ANSI SQL / multiplataforma é usar o INFORMATION_SCHEMA , que foi projetado especificamente para consultar metadados sobre objetos nos bancos de dados SQL.

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
    drop table dbo.Scores;

A maioria dos servidores RDBMS modernos fornece, pelo menos, suporte básico a Information_SCHEMA, incluindo: MySQL , Postgres , Oracle , IBM DB2 e Microsoft SQL Server 7.0 (e superior) .

jveazey
fonte
O if existsansi é compatível?
Martin Smith
8
Tenha cuidado se você tiver mais de um esquema no banco de dados. Pode ser necessário especificar quais [Pontuações] você está detectando e excluindo. Por exemplo, WHERE TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo'
Andrew Jens
@kiquenet Geralmente sim, mas não quando se usa o if existe - pois isso para assim que retorna uma linha. Mas eu pessoalmente sempre seleciono 1 de qualquer maneira.
Harag
68

Já vi tantos que realmente não funcionam. Quando uma tabela temporária é criada, ela deve ser excluída do tempdb!

O único código que funciona é:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
fonte
3
Obrigado, mudar dbopara tempdbeste trabalho. Eu também gostaria de sugerir a adição do 'u'mencionado nos comentários da resposta aceita. Assim, a completa instrução IF ficaria assim:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

No SQL Server 2016 (13.x) e superior

DROP TABLE IF EXISTS dbo.Scores

Nas versões anteriores

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
DROP TABLE dbo.Scores; 

Você é seutable type

Farhan Yaseen
fonte
28

Ou:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
fonte
4
Você pode usar sys.tables desde 2005 para simplificar este:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

Eu espero que isso ajude:

begin try drop table #tempTable end try
begin catch end catch
vlad
fonte
22

Eu escrevi um pouco de UDF que retorna 1 se o argumento for o nome de uma tabela existente, 0 caso contrário:

CREATE FUNCTION [dbo].[Table_exists]
(
    @TableName VARCHAR(200)
)
    RETURNS BIT
AS
BEGIN
    If Exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @TableName)
        RETURN 1;

    RETURN 0;
END

GO

Para excluir a tabela, Userse existir, chame-a assim:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
fonte
E o mesmo nome, mas com esquema diferente? A melhor maneira está aqui: stackoverflow.com/a/33497857/956364
Protíguo
9

Simples é o seguinte:

IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName

onde dbo.TableNameestá a sua mesa desejada e 'U' é typeda sua table.

Arsman Ahmad
fonte
6
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO
Alfaiz Ahmed
fonte
4

Eu uso:

if exists (select * 
           from sys.tables 
           where name = 'tableName' 
           and schema_id = schema_id('dbo'))
begin
    drop table dbo.tableName
end
user7463511
fonte
3

Existe uma maneira mais fácil

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
fonte
-1

Uma maneira visual e fácil melhor, se você estiver usando o Visual Studio, basta abrir na barra de menus,

Ver -> Explorador de Objetos do SQL Server

deve abrir como mostrado aqui

insira a descrição da imagem aqui

Selecione e Clique com o Botão Direito na Tabela que você deseja excluir e exclua. Essa tela deve ser exibida. Clique em Atualizar banco de dados para confirmar.

insira a descrição da imagem aqui

Esse método é muito seguro, pois fornece feedback e avisa sobre qualquer relação da tabela excluída com outras tabelas.

Githithu Wambura
fonte
5
Esta questão está relacionada a SQL, não relacionada a Visual Studio. Portanto, esta resposta é irrelevante para esta pergunta.
Adnan Sharif
-8

Faça assim, é a maneira mais fácil.

qry será sua própria consulta, o que você quiser na lista de seleção.

set @qry = ' select * into TempData from (' + @qry + ')Tmp  '

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
fonte
4
Sou apenas eu ou isso parece propenso a injeção? Por favor comente.
G00dy 31/03
5
Ele também não tem nada a ver com a questão
Martin Smith