Respostas:
É 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 .
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.
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) .
if exists
ansi é compatível?
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"
dbo
para tempdb
este 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')
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
Ou:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
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, User
se existir, chame-a assim:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Simples é o seguinte:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
onde dbo.TableName
está a sua mesa desejada e 'U' é type
da sua table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Eu uso:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Existe uma maneira mais fácil
DROP TABLE IF EXISTS table_name;
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
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.
Esse método é muito seguro, pois fornece feedback e avisa sobre qualquer relação da tabela excluída com outras tabelas.
SQL
, não relacionada a Visual Studio
. Portanto, esta resposta é irrelevante para esta pergunta.
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
'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.