Yanıtlar:
Aşağıdakileri yapmak doğru mu?
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
Hayır. Bu, yalnızca satır içeriyorsa tabloyu düşürür (ve tablo yoksa bir hata oluşturur).
Bunun yerine, kalıcı bir tablo için şunları kullanabilirsiniz:
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Veya geçici bir tablo için
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
DROP TABLE #T;
SQL Server 2016+ kullanmanın daha iyi bir yolu var DROP TABLE IF EXISTS …
. Bkz @Jovan tarafından cevap .
SQL Server 2016'dan şunları kullanabilirsiniz:
DROP TABLE IF EXISTS dbo.Scores
Başvuru: DROP IF EXISTS - SQL Server 2016'daki yeni şey
Yakında SQL Azure Veritabanında olacak.
ANSI / SQL platformlar arası bir şekilde kullanmaktır INFORMATION_SCHEMA özellikle SQL veri tabanı içinde nesneler hakkında bir sorgu meta verileri için tasarlanmıştır.
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
drop table dbo.Scores;
Modern RDBMS sunucularının çoğu, en azından aşağıdakiler de dahil olmak üzere temel BİLGİ_SCHEMA desteği sağlar: MySQL , Postgres , Oracle , IBM DB2 ve Microsoft SQL Server 7.0 (ve üstü) .
if exists
ansi uyumlu?
Gerçekten işe yaramayan o kadar çok gördün ki. geçici tablo oluşturulduğunda tempdb'den silinmesi gerekir!
Çalışan tek kod:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
yapmak için değişiyor tempdb
. Ayrıca 'u'
, kabul edilen yanıtın yorumlarında belirtildiği gibi eklenmesini öneriyorum . Böylece, tam IF deyimi şöyle görünecektir:IF OBJECT_ID('tempdb..#temp', 'U')
SQL Server 2016 (13.x) ve sonraki sürümlerde
DROP TABLE IF EXISTS dbo.Scores
Önceki sürümlerde
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
U senintable type
Veya:
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
Argümanı mevcut bir tablonun adı ise 1 döndüren küçük bir UDF yazdım, aksi takdirde 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
User
Varsa tabloyu silmek için şu şekilde çağırın:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Basit:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
nerede dbo.TableName
istediğiniz tablo ve bir 'U' olduğunu type
, aramalarınızdan table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Kullanırım:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Daha kolay bir yol var
DROP TABLE IF EXISTS table_name;
Daha iyi bir görsel ve kolay yol, Visual Studio kullanıyorsanız, menü çubuğundan açmanız yeterlidir,
Görünüm -> SQL Server Nesne Gezgini
burada gösterildiği gibi açılmalıdır
Silmek istediğiniz Tablo'yu seçin ve Sağ Tıklayın, ardından silin. Böyle bir ekran görüntülenmelidir. Onaylamak için Veritabanını Güncelle'yi tıklayın.
Bu yöntem size geri bildirimde bulunduğundan ve silinen tablonun diğer tablolarla olan ilişkilerini uyaracağından çok güvenlidir.
SQL
değil Visual Studio
. Bu nedenle, bu cevap bu soru ile ilgisizdir.
Bunu yap, en kolay yol bu.
qry
seçim listenizde ne olursa olsun kendi sorgunuz olacaktır.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
İkinci parametre için görünüşte "Yalnızca bu ada sahip tablolar olan nesneleri arayın" anlamına gelir. Bir kaynak . Bu yüzden yanlışOBJECT_ID('TableName')
değil , ama delice kesin değil, bu yüzden @ Martin mükemmel cevabında.'U'