यदि यह मौजूद है तो किसी तालिका को कैसे छोड़ें?


721

टेबल का नाम है Scores

क्या निम्न करना सही है?

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

जवाबों:


1376

क्या निम्न करना सही है?

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 …जवाब देखें @ जोवन


137
Fwiw - 'U'दूसरे परम के लिए स्पष्ट रूप से इसका मतलब है "केवल इस नाम वाली वस्तुओं की तलाश करें जो तालिकाओं हैं"। एक स्रोत । तो OBJECT_ID('TableName')यह गलत नहीं है , लेकिन यह भी बिल्कुल सटीक नहीं है, इस प्रकार 'U'@ मार्टिन के उत्कृष्ट उत्तर में।
रफ़िन

7
दूसरे परम के बारे में; यहाँ एक और स्रोत है , मैंने एक दृश्य के लिए 'V' का उपयोग किया है।
लाल मटर

4
HI क्या आप मुझे समझा सकते हैं कि OBJECT_ID ('tempdb.dbo। # T', 'U') में इस दूसरे पैरामीटर का क्या अर्थ है, उदाहरण के लिए यह 'U'?
ज़्वोनिमिर टोकिक

9
@ZvonimirTokic का अर्थ है "उपयोगकर्ता परिभाषित तालिका"। "आईटी" एक आंतरिक, प्रणाली परिभाषित, तालिका होगी। एक पूरी सूची यहाँ है msdn.microsoft.com/en-us/library/ms190324.aspx
मार्टिन स्मिथ


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 , Oracle , IBM DB2 और Microsoft SQL Server 7.0 (और अधिक)


क्या if existsएसीसी अनुपालन है?
मार्टिन स्मिथ

8
डेटाबेस में एक से अधिक स्कीमा होने पर सावधान रहें। आपको इसके बारे में विशिष्ट होना चाहिए, जिसके बारे में [स्कोर] आप पता लगा रहे हैं और हटा रहे हैं। जैसे कि TABLE_NAME = 'स्कोर' और TABLE_SCHEMA = 'dbo'
एंड्रयू जेन्स

@kiquenet आम तौर पर हाँ, लेकिन अगर मौजूद है का उपयोग करते हुए नहीं - चूंकि यह एक पंक्ति में लौटते ही बंद हो जाता है। लेकिन मैं व्यक्तिगत रूप से हमेशा वैसे भी 1 का चयन करता हूं।
हराग

68

बहुत देखा है कि वास्तव में काम नहीं करते। जब एक अस्थायी तालिका बनाई जाती है, तो उसे अस्थायी से हटा दिया जाना चाहिए!

केवल एक ही कोड काम करता है:

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')
व्हॉट्सएप

38

SQL सर्वर 2016 (13.x) और इसके बाद के संस्करण में

DROP TABLE IF EXISTS dbo.Scores

पहले के संस्करणों में

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

यू अपने हैtable type


28

या:

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

4
2005 से इसे सरल बनाने के लिए आप sys.tables का उपयोग कर सकते हैं:if exists (select * from sys.tables where name = 'Scores') drop table Scores
माइकल पार्कर

26

आशा है कि ये आपकी मदद करेगा:

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

22

मैंने थोड़ा यूडीएफ लिखा जो 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
Protiguous

9

सरल यह है कि:

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

जहां dbo.TableNameअपने वांछित मेज और है 'U' है typeअपने की table



4

मैं उपयोग करता हूं:

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


-1

एक बेहतर दृश्य और आसान तरीका, यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं, तो बस मेनू बार से खोलें,

देखें -> SQL सर्वर ऑब्जेक्ट एक्सप्लोरर

इसे यहां दिखाए गए की तरह खोलना चाहिए

यहां छवि विवरण दर्ज करें

जिस तालिका को आप हटाना चाहते हैं उसे चुनें और राइट क्लिक करें, फिर हटाएं। ऐसी स्क्रीन प्रदर्शित की जानी चाहिए। पुष्टि करने के लिए अद्यतन डेटाबेस पर क्लिक करें।

यहां छवि विवरण दर्ज करें

यह विधि बहुत सुरक्षित है क्योंकि यह आपको प्रतिक्रिया देता है और अन्य तालिकाओं के साथ हटाए गए तालिका के किसी भी संबंध की चेतावनी देगा।


5
यह प्रश्न संबंधित है SQL, इससे संबंधित नहीं है Visual Studio। इसलिए, यह उत्तर इस प्रश्न के लिए अप्रासंगिक है।
अदनान शरीफ

-8

इस तरह से करें, यह सबसे आसान तरीका है।

qry आपकी अपनी क्वेरी होगी, जो भी आप चयन सूची में चाहते हैं।

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

exec (@qry)

select * from TempData 

drop table TempData

4
यह सिर्फ मुझे है, या यह इंजेक्शन प्रवण की तरह लग रहा है? कृपया टिप्पणी करें।
g00dy

5
इसका सवाल से भी कोई लेना-देना नहीं है
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.