จะวางโต๊ะได้อย่างไรถ้ามีอยู่?


721

Scoresชื่อตารางคือ

การทำสิ่งต่อไปนี้ถูกต้องหรือไม่

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

คำตอบ:


1377

การทำสิ่งต่อไปนี้ถูกต้องหรือไม่

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

ไม่ นั่นจะดร็อปตารางเฉพาะในกรณีที่มีแถวใด ๆ (และจะเพิ่มข้อผิดพลาดหากไม่มีตาราง)

สำหรับตารางถาวรคุณสามารถใช้แทนได้

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

หรือสำหรับตารางชั่วคราวคุณสามารถใช้

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

SQL Server 2016+ DROP TABLE IF EXISTS …มีวิธีที่ดีกว่าการใช้ ดูคำตอบโดย @Jovan


137
Fwiw - 'U'พารามิเตอร์ที่สองดูเหมือนจะหมายถึง "ค้นหาเฉพาะวัตถุที่มีชื่อนี้คือตาราง" แหล่งเดียว ดังนั้นOBJECT_ID('TableName')ไม่ผิดแต่ก็ไม่แม่นยำเมามันทั้งดังนั้น'U'ใน @ คำตอบที่ดีมาร์ติน
ruffin

7
เกี่ยวกับพารามิเตอร์ที่สอง นี่คือแหล่งข้อมูลอื่นฉันใช้ 'V' เพื่อดู
ถั่วแดง

4
สวัสดีคุณช่วยอธิบายฉันได้ไหมว่าพารามิเตอร์ตัวที่สองนี้มีความหมายอย่างไรใน OBJECT_ID ('tempdb.dbo. # T', 'U') ตัวอย่างเช่น 'U' นี้หรือไม่
Zvonimir Tokic

9
@ZvonimirTokic หมายถึง "ตารางที่ผู้ใช้กำหนด" "IT" จะเป็นตารางที่ระบบกำหนดภายใน รายการทั้งหมดอยู่ที่นี่msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith


151

วิธี ANSI SQL / ข้ามแพลตฟอร์มคือการใช้INFORMATION_SCHEMAซึ่งได้รับการออกแบบมาโดยเฉพาะเพื่อสืบค้นข้อมูลเมตาเกี่ยวกับวัตถุภายในฐานข้อมูล SQL

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

ส่วนใหญ่เซิร์ฟเวอร์ RDBMS ที่ทันสมัยให้อย่างน้อยสนับสนุน INFORMATION_SCHEMA พื้นฐานรวมถึง: MySQL , Postgres , ออราเคิล , IBM DB2และMicrosoft SQL Server 7.0 (และสูงกว่า)


เป็นif existsไปตามมาตรฐาน ansi หรือไม่
Martin Smith

8
ระวังถ้าคุณมีสคีมามากกว่าหนึ่งฐานข้อมูล คุณอาจต้องเจาะจงเกี่ยวกับ [คะแนน] ที่คุณกำลังตรวจจับและลบ เช่น WHERE TABLE_NAME = 'คะแนน' และ TABLE_SCHEMA = 'dbo'
Andrew Jens

@kiquenet โดยทั่วไปแล้วใช่ แต่ไม่ใช่เมื่อใช้หากมีอยู่ - เนื่องจากจะหยุดทันทีที่ส่งคืนหนึ่งแถว แต่โดยส่วนตัวฉันเลือก 1 อยู่เสมอ
Harag

68

เคยเห็นคนมากมายที่ไม่ได้ผล เมื่อสร้างตารางชั่วคราวจะต้องลบออกจาก tempdb!

รหัสเดียวที่ใช้งานได้คือ:

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

3
ขอขอบคุณการเปลี่ยนแปลงdboที่จะtempdbทำให้การทำงานนี้ ฉันขอแนะนำให้เพิ่มสิ่ง'u'ที่กล่าวถึงในความคิดเห็นของคำตอบที่ยอมรับ ดังนั้นคำสั่ง IF แบบเต็มจะมีลักษณะเช่นนี้:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz

38

ใน SQL Server 2016 (13.x) ขึ้นไป

DROP TABLE IF EXISTS dbo.Scores

ในรุ่นก่อนหน้า

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

Uเป็นของคุณtable type


28

หรือ:

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

4
คุณสามารถใช้ sys.tables ตั้งแต่ปี 2005 เพื่อทำให้สิ่งนี้ง่ายขึ้น:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker


22

ฉันเขียน UDF เล็กน้อยที่คืนค่า 1 ถ้าอาร์กิวเมนต์เป็นชื่อของตารางที่มีอยู่หรือ 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หากมีอยู่ให้เรียกใช้ดังนี้:

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

ชื่อเดียวกัน แต่สคีมาต่างกันอย่างไร วิธีที่ดีที่สุดอยู่ที่นี่: stackoverflow.com/a/33497857/956364
ชัดเจน

9

ง่าย ๆ คือ:

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

ที่dbo.TableNameอยู่ในตารางของคุณต้องการและ'U'เป็นของคุณtypetable





-1

วิธีที่ง่ายและเห็นได้ดีขึ้นหากคุณใช้ Visual Studio เพียงแค่เปิดจากแถบเมนู

ดู -> SQL Server Object Explorer

ควรเปิดเหมือนที่แสดงที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

เลือกและคลิกขวาที่ตารางที่คุณต้องการลบจากนั้นลบ ควรแสดงหน้าจอดังกล่าว คลิกอัปเดตฐานข้อมูลเพื่อยืนยัน

ป้อนคำอธิบายรูปภาพที่นี่

วิธีนี้ปลอดภัยมากเพราะให้ผลตอบรับแก่คุณและจะเตือนความสัมพันธ์ของตารางที่ถูกลบกับตารางอื่น ๆ


5
คำถามนี้เป็นคำถามที่เกี่ยวข้องกับการไม่เกี่ยวข้องกับSQL Visual Studioดังนั้นคำตอบนี้ไม่เกี่ยวข้องกับคำถามนี้
Adnan Sharif

-8

ทำแบบนี้มันเป็นวิธีที่ง่ายที่สุด

qry จะเป็นแบบสอบถามของคุณเองสิ่งที่คุณต้องการในรายการที่เลือก

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

exec (@qry)

select * from TempData 

drop table TempData

4
มันเป็นเพียงฉันหรือดูเหมือนว่าการฉีดมีแนวโน้มที่จะ? โปรดแสดงความคิดเห็น.
g00dy

5
นอกจากนี้ยังไม่มีอะไรเกี่ยวข้องกับคำถาม
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.