¿Cómo soltar una tabla si existe?

721

El nombre de la tabla es Scores.

¿Es correcto hacer lo siguiente?

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

Respuestas:

1377

¿Es correcto hacer lo siguiente?

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

No. Eso eliminará la tabla solo si contiene filas (y generará un error si la tabla no existe).

En cambio, para una mesa permanente puedes usar

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

O, para una tabla temporal, puede usar

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

SQL Server 2016+ tiene una mejor manera, usando DROP TABLE IF EXISTS …. Ver la respuesta de @Jovan .

Martin Smith
fuente
137
Fwiw - El 'U'para el segundo parámetro aparentemente significa "Solo busca objetos con este nombre que sean tablas". Una de las fuentes . Así OBJECT_ID('TableName')que no está mal , pero tampoco es increíblemente preciso, por lo tanto, 'U'en la excelente respuesta de @ Martin.
ruffin el
77
En cuanto al segundo parámetro; Aquí hay otra fuente , utilicé 'V' para una vista.
The Red Pea
44
Hola, ¿puede explicarme qué significa este segundo parámetro en OBJECT_ID ('tempdb.dbo. # T', 'U'), por ejemplo, esta 'U'?
Zvonimir Tokic
99
@ZvonimirTokic significa "Tabla definida por el usuario". "IT" sería una tabla interna definida por el sistema. Una lista completa está aquí msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
151

La forma ANSI SQL / multiplataforma es usar el INFORMATION_SCHEMA , que fue diseñado específicamente para consultar metadatos sobre objetos dentro de bases de datos SQL.

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

La mayoría de los servidores RDBMS modernos proporcionan, al menos, soporte básico de INFORMATION_SCHEMA, que incluye: MySQL , Postgres , Oracle , IBM DB2 y Microsoft SQL Server 7.0 (y superior) .

jveazey
fuente
¿ if existsCumple el ansi?
Martin Smith
8
Tenga cuidado si tiene más de un esquema en la base de datos. Es posible que necesite ser específico sobre qué [Puntuaciones] está detectando y eliminando. Por ejemplo, WHERE TABLE_NAME = 'Puntajes' Y TABLE_SCHEMA = 'dbo'
Andrew Jens
@kiquenet Generalmente sí, pero no cuando se usa el if, ya que esto se detiene tan pronto como devuelve una fila. Pero personalmente siempre selecciono 1 de todos modos.
Harag
68

He visto tantos que realmente no funcionan. cuando se crea una tabla temporal, debe eliminarse de tempdb.

El único código que funciona es:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
fuente
3
Gracias, cambiando dbopara tempdbhacer que esto funcione. También me gustaría sugerir agregar lo 'u'mencionado en los comentarios de la respuesta aceptada. Por lo tanto, la declaración IF completa se vería así:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

En SQL Server 2016 (13.x) y superior

DROP TABLE IF EXISTS dbo.Scores

En versiones anteriores

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

U es tutable type

Farhan Yaseen
fuente
28

O:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
fuente
44
Puede usar sys.tables desde 2005 para simplificar esto:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

Espero que esto ayude:

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

Escribí un pequeño UDF que devuelve 1 si su argumento es el nombre de una tabla existente, 0 de lo contrario:

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 eliminar la tabla Usersi existe, llámela así:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
fuente
¿Qué pasa con el mismo nombre pero con un esquema diferente? La mejor manera es aquí: stackoverflow.com/a/33497857/956364
Protiguosa
9

Simple es eso:

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

dónde dbo.TableNameestá tu mesa deseada y 'U' es typetuya table.

Arsman Ahmad
fuente
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
fuente
4

Yo suelo:

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

Hay una manera más fácil

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
fuente
-1

Una mejor manera visual y fácil, si está utilizando Visual Studio, simplemente abra desde la barra de menú,

Ver -> Explorador de objetos de SQL Server

debería abrirse como se muestra aquí

ingrese la descripción de la imagen aquí

Seleccione y haga clic derecho en la tabla que desea eliminar, luego elimine. Tal pantalla debería mostrarse. Haga clic en Actualizar base de datos para confirmar.

ingrese la descripción de la imagen aquí

Este método es muy seguro, ya que le brinda retroalimentación y le advertirá de cualquier relación de la tabla eliminada con otras tablas.

Githithu Wambura
fuente
55
Esta pregunta está relacionada con SQL, no está relacionada con Visual Studio. Por lo tanto, esta respuesta es irrelevante para esta pregunta.
Adnan Sharif
-8

Hazlo así, es la forma más fácil.

qry será tu propia consulta, lo que quieras en la lista de selección.

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

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
fuente
44
¿Soy solo yo, o esto parece propenso a la inyección? Por favor comenta.
g00dy
55
Tampoco tiene nada que ver con la pregunta
Martin Smith