Làm thế nào để thả một bảng nếu nó tồn tại?


721

Tên bảng là Scores.

Là chính xác để làm như sau?

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

Câu trả lời:


1377

Là chính xác để làm như sau?

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

Không. Điều đó sẽ làm rơi bảng chỉ khi nó chứa bất kỳ hàng nào (và sẽ phát sinh lỗi nếu bảng không tồn tại).

Thay vào đó, đối với một bảng vĩnh viễn, bạn có thể sử dụng

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

Hoặc, đối với một bảng tạm thời, bạn có thể sử dụng

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

SQL Server 2016+ có cách tốt hơn, sử dụng DROP TABLE IF EXISTS …. Xem câu trả lời của @Jovan .


137
Fwiw - Thông 'U'số thứ hai rõ ràng có nghĩa là "Chỉ tìm các đối tượng có tên này là bảng". Một nguồn . Vì vậy, OBJECT_ID('TableName')không sai , nhưng nó cũng không hoàn toàn chính xác, do đó, 'U'trong câu trả lời tuyệt vời của @ Martin.
ruffin

7
Về thông số thứ hai; Đây là một nguồn khác , tôi đã sử dụng 'V' cho Chế độ xem.
Hạt đậu đỏ

4
HI, bạn có thể giải thích cho tôi ý nghĩa của tham số thứ hai này trong OBJECT_ID ('tempdb.dbo. # T', 'U'), ví dụ: 'U' này không?
Zvonimir Tokic

9
@ZvonimirTokic có nghĩa là "Bảng do người dùng xác định". "CNTT" sẽ là một bảng nội bộ, được xác định hệ thống. Một danh sách đầy đủ có ở đây msdn.microsoft.com/en-us/l Library / ms190324.aspx
Martin Smith


151

Cách ANSI SQL / đa nền tảng là sử dụng Information_SCHema , được thiết kế riêng để truy vấn dữ liệu meta về các đối tượng trong cơ sở dữ liệu SQL.

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

Hầu hết các máy chủ RDBMS hiện đại đều cung cấp, ít nhất là hỗ trợ Information_SCHema cơ bản, bao gồm: MySQL , Postgres , Oracle , IBM DB2Microsoft SQL Server 7.0 (và cao hơn) .


if existsansi phù hợp?
Martin Smith

8
Hãy cẩn thận nếu bạn có nhiều hơn một lược đồ trong cơ sở dữ liệu. Bạn có thể cần phải cụ thể về [Điểm] mà bạn đang phát hiện và xóa. Ví dụ: WHERE TABLE_NAME = 'Điểm' VÀ TABLE_SCHema = 'dbo'
Andrew Jens

@kiquenet Nói chung là có, nhưng không phải khi sử dụng if tồn tại - vì điều này dừng ngay khi nó trả về một hàng. Nhưng cá nhân tôi luôn luôn chọn 1.
Harag

68

Đã thấy rất nhiều mà không thực sự làm việc. khi một bảng tạm thời được tạo, nó phải bị xóa khỏi tempdb!

Mã duy nhất hoạt động là:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"

3
Cảm ơn, thay đổi dbođể tempdbthực hiện công việc này. Tôi cũng muốn đề xuất thêm 'u'như đã đề cập trong các bình luận của câu trả lời được chấp nhận. Do đó, câu lệnh IF đầy đủ sẽ giống như thế này:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz

38

Trong SQL Server 2016 (13.x) trở lên

DROP TABLE IF EXISTS dbo.Scores

Trong các phiên bản trước

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

Bạn là của bạntable type


28

Hoặc là:

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

4
Bạn có thể sử dụng sys.tables kể từ năm 2005 để đơn giản hóa việc này:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker

26

Tôi hi vọng cái này giúp được:

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

22

Tôi đã viết một UDF nhỏ trả về 1 nếu đối số của nó là tên của một bảng còn lại, 0 nếu không:

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

Để xóa bảng Usernếu nó tồn tại, hãy gọi nó như vậy:

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

Điều gì về cùng tên nhưng lược đồ khác nhau? Cách tốt nhất là ở đây: stackoverflow.com/a/33497857/956364
Protiguity

9

Đơn giản là:

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

nơi dbo.TableNamelà bảng mong muốn của bạn và 'U'typecủa bạn 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

Tôi sử dụng:

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


-1

Một cách trực quan và dễ dàng hơn, nếu bạn đang sử dụng Visual Studio, chỉ cần mở từ thanh menu,

Xem -> SQL Server Object Explorer

nó sẽ mở như hiển thị ở đây

nhập mô tả hình ảnh ở đây

Chọn và Nhấp chuột phải vào Bảng bạn muốn xóa, sau đó xóa. Một màn hình như vậy nên được hiển thị. Nhấp vào Cập nhật cơ sở dữ liệu để xác nhận.

nhập mô tả hình ảnh ở đây

Phương pháp này rất an toàn vì nó cung cấp cho bạn thông tin phản hồi và sẽ cảnh báo mọi mối quan hệ của bảng đã xóa với các bảng khác.


5
Câu hỏi này có liên quan đến SQL, không liên quan đến Visual Studio. Do đó, câu trả lời này không liên quan đến câu hỏi này.
Adnan Sharif

-8

Làm như thế này, đó là cách dễ nhất.

qry sẽ là truy vấn của riêng bạn, bất cứ điều gì bạn muốn trong danh sách chọn.

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

exec (@qry)

select * from TempData 

drop table TempData

4
Có phải chỉ có tôi, hoặc điều này trông giống như tiêm dễ dàng? Hãy bình luận.
g00dy

5
Nó cũng không liên quan gì đến câu hỏi
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.