Bagaimana cara menjatuhkan tabel jika ada?

721

Nama tabelnya adalah Scores.

Apakah benar melakukan hal berikut?

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

Jawaban:

1377

Apakah benar melakukan hal berikut?

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

Tidak. Itu akan menjatuhkan tabel hanya jika mengandung baris (dan akan menimbulkan kesalahan jika tabel tidak ada).

Sebagai gantinya, untuk tabel permanen bisa Anda gunakan

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

Atau, untuk tabel sementara yang bisa Anda gunakan

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

SQL Server 2016+ memiliki cara yang lebih baik, menggunakan DROP TABLE IF EXISTS …. Lihat jawabannya oleh @Jovan .

Martin Smith
sumber
137
Fwiw - The 'U'untuk param kedua tampaknya berarti "Hanya mencari objek dengan nama ini yang merupakan tabel". Satu sumber . Jadi OBJECT_ID('TableName')tidak salah , tapi juga tidak tepat, jadi 'U'dalam jawaban yang sangat bagus dari @ Martin.
ruffin
7
Mengenai param kedua; di sini adalah sumber lain , saya menggunakan 'V' untuk Tampilan.
The Red Pea
4
HI, bisakah Anda menjelaskan kepada saya apa arti parameter kedua ini di OBJECT_ID ('tempdb.dbo. # T', 'U'), misalnya ini 'U'?
Zvonimir Tokic
9
@ZvonimirTokic artinya "Tabel yang ditentukan pengguna". "IT" akan berupa tabel internal, yang ditentukan sistem,. Daftar lengkapnya ada di sini msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
151

Cara ANSI SQL / lintas-platform adalah dengan menggunakan INFORMATION_SCHEMA , yang secara khusus dirancang untuk meminta data meta tentang objek dalam database SQL.

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
    drop table dbo.Scores;

Sebagian besar server RDBMS modern menyediakan, setidaknya, dukungan dasar INFORMATION_SCHEMA, termasuk: MySQL , Postgres , Oracle , IBM DB2 , dan Microsoft SQL Server 7.0 (dan lebih besar) .

jveazey
sumber
Apakah if existsansi sesuai?
Martin Smith
8
Hati-hati jika Anda memiliki lebih dari satu skema dalam database. Anda mungkin harus spesifik tentang [Skor] yang Anda deteksi dan hapus. Misalnya WHERE TABLE_NAME = 'Skor' DAN TABLE_SCHEMA = 'dbo'
Andrew Jens
@kiquenet Secara umum ya, tetapi tidak ketika menggunakan jika ada - karena ini berhenti segera setelah mengembalikan satu baris. Tapi saya pribadi selalu memilih 1.
Harag
68

Telah melihat begitu banyak yang tidak benar-benar berfungsi. ketika tabel temp dibuat, itu harus dihapus dari tempdb!

Satu-satunya kode yang berfungsi adalah:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
sumber
3
Terima kasih, berubah dbountuk tempdbmenjadikan ini berfungsi. Saya juga ingin menyarankan untuk menambahkan 'u'seperti yang disebutkan dalam komentar jawaban yang diterima. Dengan demikian, pernyataan IF lengkap akan terlihat seperti ini:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

Di SQL Server 2016 (13.x) dan di atasnya

DROP TABLE IF EXISTS dbo.Scores

Dalam versi sebelumnya

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

Kamu adalah milikmutable type

Farhan Yaseen
sumber
28

Atau:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
sumber
4
Anda dapat menggunakan sys.tables sejak 2005 untuk menyederhanakan ini:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

Saya harap ini membantu:

begin try drop table #tempTable end try
begin catch end catch
vlad
sumber
22

Saya menulis UDF kecil yang mengembalikan 1 jika argumennya adalah nama tabel yang masih ada, 0 sebaliknya:

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

Untuk menghapus tabel Userjika ada, panggil seperti itu:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
sumber
Bagaimana dengan nama yang sama tetapi skema yang berbeda? Cara terbaik ada di sini: stackoverflow.com/a/33497857/956364
Protiguous
9

Sederhana itu:

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

di mana dbo.TableNamemeja yang Anda inginkan dan 'U' adalah typemilik Anda table.

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

Saya menggunakan:

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

Ada cara yang lebih mudah

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
sumber
-1

Cara visual yang lebih baik dan mudah, jika Anda menggunakan Visual Studio, cukup buka dari menu bar,

Lihat -> SQL Server Object Explorer

itu harus terbuka seperti yang ditunjukkan di sini

masukkan deskripsi gambar di sini

Pilih dan Klik Kanan Tabel yang ingin Anda hapus, lalu hapus. Layar seperti itu harus ditampilkan. Klik Perbarui Database untuk mengonfirmasi.

masukkan deskripsi gambar di sini

Metode ini sangat aman karena memberi Anda umpan balik dan akan memperingatkan hubungan apa pun dari tabel yang dihapus dengan tabel lainnya.

Githithu Wambura
sumber
5
Pertanyaan ini terkait dengan SQL, tidak terkait dengan Visual Studio. Karena itu, jawaban ini tidak relevan dengan pertanyaan ini.
Adnan Sharif
-8

Lakukan seperti ini, itu adalah cara termudah.

qry akan menjadi permintaan Anda sendiri, apa pun yang Anda inginkan dalam daftar pilih.

set @qry = ' select * into TempData from (' + @qry + ')Tmp  '

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
sumber
4
Apakah hanya saya, atau ini sepertinya rawan injeksi? Tolong beri komentar anda.
g00dy
5
Ini juga tidak ada hubungannya dengan pertanyaan
Martin Smith