Respuestas:
¿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 .
Desde SQL Server 2016 puede usar
DROP TABLE IF EXISTS dbo.Scores
Referencia: DROP IF EXISTS - algo nuevo en SQL Server 2016
Pronto estará en la Base de datos SQL Azure.
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 exists
Cumple el ansi?
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"
dbo
para tempdb
hacer 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')
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
O:
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
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 User
si existe, llámela así:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Simple es eso:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
dónde dbo.TableName
está tu mesa deseada y 'U' es type
tuya table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Yo suelo:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Hay una manera más fácil
DROP TABLE IF EXISTS table_name;
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í
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.
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.
SQL
, no está relacionada con Visual Studio
. Por lo tanto, esta respuesta es irrelevante para esta pregunta.
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
'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.