¿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

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 .


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) .


¿ 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"

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


28

O:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores

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

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]

¿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.


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

4

Yo suelo:

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


-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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.