Odpowiedzi:
Czy poprawne jest wykonanie następujących czynności?
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
Nie. Spowoduje to upuszczenie tabeli tylko wtedy, gdy zawiera ona wiersze (i spowoduje błąd, jeśli tabela nie istnieje).
Zamiast tego możesz użyć stałego stołu
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Lub, do tymczasowego stołu możesz użyć
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
DROP TABLE #T;
SQL Server 2016+ ma lepszy sposób, używając DROP TABLE IF EXISTS …
. Zobacz odpowiedź @Jovan .
Z SQL Server 2016 możesz używać
DROP TABLE IF EXISTS dbo.Scores
Odniesienie: DROP IF EXISTS - nowość w SQL Server 2016
Wkrótce będzie w bazie danych SQL Azure.
ANSI SQL / wieloplatformowy sposób polega na wykorzystaniu INFORMACJE_SCHEMA , która została zaprojektowana specjalnie do przeszukiwania metadanych dotyczących obiektów w bazach danych SQL.
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
drop table dbo.Scores;
Większość nowoczesnych serwerów RDBMS zapewnia co najmniej podstawową obsługę INFORMACJE_SCHEMA, w tym: MySQL , Postgres , Oracle , IBM DB2 i Microsoft SQL Server 7.0 (i nowsze) .
if exists
ansi jest zgodne?
Widziałem tak wiele, że tak naprawdę nie działają. po utworzeniu tabeli tymczasowej należy ją usunąć z tempdb!
Jedyny działający kod to:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
żeby tempdb
to działało. Chciałbym również zasugerować dodanie odpowiedzi 'u'
wymienionych w komentarzach przyjętej odpowiedzi. Zatem pełne wyrażenie IF wyglądałoby tak:IF OBJECT_ID('tempdb..#temp', 'U')
W SQL Server 2016 (13.x) i nowszych
DROP TABLE IF EXISTS dbo.Scores
We wcześniejszych wersjach
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
U jest twójtable type
Lub:
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
Napisałem mały UDF, który zwraca 1, jeśli jego argumentem jest nazwa istniejącej tabeli, w przeciwnym razie 0:
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
Aby usunąć tabelę, User
jeśli istnieje, nazwij ją tak:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Proste jest to, że:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
gdzie dbo.TableName
jest twój pożądany stół, a „U” jest type
twój table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Używam:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Jest łatwiejszy sposób
DROP TABLE IF EXISTS table_name;
Lepszy wizualny i łatwy sposób, jeśli używasz Visual Studio, wystarczy otworzyć z paska menu,
Widok -> Eksplorator obiektów SQL Server
powinien się otworzyć jak pokazano tutaj
Wybierz i kliknij prawym przyciskiem myszy tabelę, którą chcesz usunąć, a następnie usuń. Taki ekran powinien zostać wyświetlony. Kliknij Aktualizuj bazę danych, aby potwierdzić.
Ta metoda jest bardzo bezpieczna, ponieważ zapewnia informacje zwrotne i ostrzega o wszelkich relacjach usuniętej tabeli z innymi tabelami.
SQL
, a nie powiązane Visual Studio
. Dlatego ta odpowiedź nie ma znaczenia dla tego pytania.
Zrób tak, to najprostszy sposób.
qry
będzie twoje zapytanie, cokolwiek chcesz na liście wyboru.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
Drugi parametr najwyraźniej oznacza „Szukaj tylko obiektów o tej nazwie, które są tabelami”. Jedno źródło . ToOBJECT_ID('TableName')
nie jest złe , ale też nie jest niesamowicie precyzyjne, dlatego'U'
w doskonałej odpowiedzi @ Martina.