Varsa bir tablo nasıl bırakılır?


721

Tablo adı Scores.

Aşağıdakileri yapmak doğru mu?

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

Yanıtlar:


1378

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 .


137
Fwiw - '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'
ruffin

7
İkinci parametre ile ilgili olarak; işte başka bir kaynak , bir görünüm için 'V' kullandım.
Kırmızı Bezelye

4
HI bana bu ikinci parametrenin OBJECT_ID ('tempdb.dbo. # T', 'U'), örneğin bu 'U' ne anlama geldiğini açıklayabilir misiniz?
Zvonimir Tokic

9
@ZvonimirTokic "Kullanıcı tanımlı Tablo" anlamına gelir. "BT", dahili, sistem tanımlı bir tablo olacaktır. Tam liste burada msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith


151

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 existsansi uyumlu?
Martin Smith

8
Veritabanında birden fazla şemanız varsa dikkatli olun. Hangi [Skorlar] ı algıladığınız ve sildiğiniz konusunda net olmanız gerekebilir. Örneğin, WHERE TABLE_NAME = 'Puanlar' VE TABLE_SCHEMA = 'dbo'
Andrew Jens

@kiquenet Genel olarak evet, ancak if varsa kullanılırken değil - çünkü bir satır döner dönmez durur. Ama şahsen ben her zaman zaten 1 seçiyorum.
Harag

69

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"

3
Teşekkürler, bu işi dboyapmak 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')
whiteshooz

39

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


28

Veya:

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

4
Bunu basitleştirmek için 2005'ten beri sys.tables'ı kullanabilirsiniz:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker

26

Umarım bu yardımcı olur:

begin try drop table #tempTable end try
begin catch end catch

22

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

UserVarsa tabloyu silmek için şu şekilde çağırın:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]

Aynı isimden farklı şemadan ne haber? En iyi yol burada: stackoverflow.com/a/33497857/956364
Protiguous

9

Basit:

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

nerede dbo.TableNameistediğiniz tablo ve bir 'U' olduğunu type, aramalarınızdan 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

Kullanırım:

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


-1

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

resim açıklamasını buraya girin

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.

resim açıklamasını buraya girin

Bu yöntem size geri bildirimde bulunduğundan ve silinen tablonun diğer tablolarla olan ilişkilerini uyaracağından çok güvenlidir.


5
Bu soru ile ilgili, ilgili SQLdeğil Visual Studio. Bu nedenle, bu cevap bu soru ile ilgisizdir.
Adnan Sharif

-8

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

4
Sadece ben mi, yoksa enjeksiyon eğilimli mi? Lütfen yorum yapın.
g00dy

5
Ayrıca bu sorunun da bir ilgisi yok
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.