जाँच करें कि क्या तालिका SQL सर्वर में मौजूद है


1142

मैं यह जानना चाहूंगा कि SQL सर्वर 2000/2005 में SQL स्टेटमेंट्स का उपयोग करके तालिका मौजूद है या नहीं, इसकी जांच कैसे की जाए।

जब आप उत्तर के लिए Google करते हैं, तो आपको बहुत सारे अलग-अलग उत्तर मिलते हैं। क्या ऐसा करने का एक आधिकारिक / पिछड़ा और आगे संगत तरीका है?

इसे करने के दो संभावित तरीके यहां दिए गए हैं। दोनों में से कौन सा इसे करने का मानक / सर्वोत्तम तरीका है?

पहला तरीका:

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

दूसरा तरीका:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL सरल प्रदान करता है

SHOW TABLES LIKE '%tablename%'; 

बयान। मैं कुछ इसी तरह की तलाश में हूं।


1
Sys.tables के बजाय INFORMATION_SCHEMA.TABLES का उपयोग करना सबसे अच्छा क्यों है, फिर किसी भी नाम के साथ फ़िल्टर करना संभवत: एक type_desc मान चेक जोड़ें?
डांटे.स्मिथ

जवाबों:


1331

इस तरह के प्रश्नों के लिए एक INFORMATION_SCHEMAदृश्य का उपयोग करना हमेशा सबसे अच्छा होता है । ये विचार कई अलग-अलग डेटाबेस में (अधिकतर) मानक हैं और शायद ही कभी संस्करण से संस्करण में बदलते हैं।

यह जाँचने के लिए कि क्या तालिका मौजूद है:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

12
बहुत अच्छा काम करता है! T-SQL में (मूल पोस्टर के जवाब में), हालांकि, यह TABLE_SCHEMA है, SCHEMA_NAME नहीं। पारितोषिक के लिए धन्यवाद।
निकोलस पियासेकी

10
यह देखते हुए कि एक ऑब्जेक्ट नाम अकेले (एक स्कीमा के बिना) अद्वितीय होने की गारंटी नहीं है, ऐसा करने के लिए कोई 100% असफल तरीका नहीं है। यदि आप एक DB के साथ काम कर रहे हैं जिसका स्कीमा में कोई नामकरण संघर्ष नहीं है, तो बस "TABLE_SCHEMA = 'TheSchema' को छोड़ देना ठीक रहेगा।
अंकमड

26
एक अस्थायी तालिका की जांच करने के लिए, हमें tempdb डेटाबेस को क्वेरी करना होगा और तालिका के नाम के लिए एक LIKE ऑपरेटर का उपयोग करना होगाSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant

4
नीचे दी गई एक प्रतिक्रिया जो OBJECT_ID फ़ंक्शन का उपयोग करती है, प्रति कनेक्शन टेबलों के संबंध में सही ढंग से काम करती है - stackoverflow.com/a/2155299/16147
रिच रूसो

4
@akmad SQL क्वेरी कंपाइलर क्वेरी चलाने से पहले तालिका के लिए जाँच करेगा और शुरू होने से पहले भी विफल हो जाएगा।
मार्क के

278

यह भी ध्यान दें कि यदि किसी कारण से आपको एक अस्थायी तालिका के लिए जाँच करने की आवश्यकता है तो आप यह कर सकते हैं:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

10
इस पद्धति का उपयोग करने से अस्थायी तालिकाओं की प्रति कनेक्शन प्रकृति का सम्मान होता है। पहले पोस्ट की गई INFORMATION_SCHEMA क्वेरी तालिका बनाए गए कनेक्शन की परवाह किए बिना पंक्तियों को वापस कर देगी।
रिच रूसो 14

238

OBJECT_IDजब तक मुझे याद है हम हमेशा शैली का उपयोग करते हैं

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

16
मेरा मानना ​​है कि यह तेजी से होगा, हालांकि बहुत पोर्टेबल नहीं है। सूचना स्कीमा दृश्य किसी भी DBRMS पर मौजूद होने की गारंटी है जो मानक का समर्थन करता है। इसके अलावा, सादा OBJECT_ID ऑब्जेक्ट की तालिका की गारंटी नहीं देता है।
जो पिनाडा

9
धन्यवाद जो, मैं सोच रहा था कि आप OBJECT_ID बनाम INFORMATION_SCHEMA.TABLES बनाम sys.tables का उपयोग क्यों करेंगे। यह बताते हुए कि INFORMATION_SCHEMA उस सवाल का एक बहुत सुंदर मानक है। BTW यह हास्यास्पद है, हमारे डेटाबेस विशेषज्ञों में से एक है जो मैं यह सवाल पूछने जा रहा था कि आपके पास एक ही अंतिम नाम है, डेटाबेस के लिए एक अच्छा अंतिम नाम होना चाहिए।
एपिरॉन

24
@JoePineda: तब आप OBJECT_ID('TableName', 'U')वस्तु तालिका की गारंटी देने के लिए उपयोग करते हैं।
एलोन गुरिलनेक

1
@AllonGuralnek तो, एक सरल और पोर्टेबल मानक का पालन करने के बजाय, क्रिप्टिक जानकारी का एक अतिरिक्त टुकड़ा जोड़ें?
परिभाषित करता है

22
@DustinFineout: सवाल tsql को टैग किया गया था , इसलिए पोर्टेबिलिटी उतना लागू नहीं होता है। सामान्य तौर पर मैंने बहुत कम पोर्टेबल कोडबेस का सामना किया है और अगर सक्सेसनेस को अहमियत दी जाती है, तो यह निश्चित रूप IF EXISTSसे उस उत्तर को बार-बार लिखने से धड़कता है । इसके अलावा, सब कुछ गुप्त है जब तक कि आप दस्तावेज़ीकरण नहीं पढ़ते हैं, विशेष रूप से टी-एसक्यूएल (या किसी अन्य संस्करण, वास्तव में) में।
एलोन गुरिलनेक

132

कृपया नीचे दिए गए दृष्टिकोण को देखें,

दृष्टिकोण 1: INFORMATION_SCHEMA.TABLES दृश्य का उपयोग करना

यदि ग्राहक तालिका वर्तमान डेटाबेस में मौजूद है, तो हम यह जांचने के लिए नीचे एक क्वेरी लिख सकते हैं।

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

दृष्टिकोण 2: OBJECT_ID () फ़ंक्शन का उपयोग करना

यदि ग्राहक तालिका वर्तमान डेटाबेस में मौजूद है, तो हम नीचे की तरह OBJECT_ID () फ़ंक्शन का उपयोग कर सकते हैं।

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

दृष्टिकोण 3: sys.Objects कैटलॉग दृश्य का उपयोग करना

हम नीचे दिखाए गए अनुसार तालिका के अस्तित्व की जांच करने के लिए Sys.Objects सूची दृश्य का उपयोग कर सकते हैं:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

दृष्टिकोण 4: sys.Tables कैटलॉग दृश्य का उपयोग करना

हम नीचे दिखाए गए अनुसार तालिका के अस्तित्व की जांच करने के लिए Sys.Tables सूची दृश्य का उपयोग कर सकते हैं:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

दृष्टिकोण 5: sys.sysobjects सिस्टम टेबल का उपयोग करने से बचें

हमें सीधे sys.sysobjects सिस्टम टेबल का उपयोग करने से बचना चाहिए, इसका सीधा उपयोग Sql सर्वर के कुछ भविष्य के संस्करणों में किया जाएगा। Microsoft BOL लिंक के अनुसार, Microsoft सीधे sys.sysobjects सिस्टम टेबल के बजाय कैटलॉग दृश्य sys.objects / sys.tables का उपयोग करने का सुझाव दे रहा है।

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

से संदर्भित: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/



26

बस एक स्थिति का उल्लेख करना चाहता था जहां OBJECT_IDविधि का उपयोग करना थोड़ा आसान होगा । INFORMATION_SCHEMAदृश्यों में से प्रत्येक डाटाबेस के तहत वस्तुओं रहे हैं

सूचना स्कीमा दृश्य को INFORMATION_SCHEMA नामक एक विशेष स्कीमा में परिभाषित किया गया है। यह स्कीमा प्रत्येक डेटाबेस में समाहित है।

https://msdn.microsoft.com/en-us/library/ms186778.aspx

इसलिए आपके द्वारा उपयोग किए जाने वाले सभी टेबल

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

केवल प्रतिबिंबित करेगा कि क्या है [database]। यदि आप यह जांचना चाहते हैं कि किसी अन्य डेटाबेस में मौजूद तालिकाओं को गतिशील रूप से [database]हर बार बदलने के बिना , OBJECT_IDक्या आप इसे बॉक्स से बाहर कर देंगे। भूतपूर्व

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

साथ ही साथ काम करता है

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL सर्वर 2016 संपादित करें :

2016 से शुरू, Microsoft ने गैर-मौजूद वस्तुओं के लिए जाँच करने की क्षमता को सरलीकरण करने से पहले सरलीकृत किया, जिसमें if existsकीवर्ड को dropबयानों में शामिल किया गया था। उदाहरण के लिए,

drop table if exists mytablename

कोड की 1 पंक्ति में OBJECT_ID/ INFORMATION_SCHEMAरैपर्स के समान कार्य करेगा ।

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/



13

सूचना स्कीमा का उपयोग करना SQL मानक तरीका है, इसलिए इसका उपयोग सभी डेटाबेस द्वारा किया जाना चाहिए जो इसका समर्थन करते हैं।


12
यह एक टिप्पणी होनी चाहिए थी।
अंडरस्कोर_ड

3
इस उत्तर में सुधार की आवश्यकता है।
rory.ap

11
IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

यहाँ उपरोक्त कोड में, तालिका का नाम है Mapping_APCToFANavigator


2
यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, तो कृपया टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और { }संपादक टूलबार पर "कोड सैंपल" बटन ( ) पर क्लिक करके अच्छी तरह से प्रारूप और सिंटैक्स को हाइलाइट करें!
marc_s

1
ध्यान दें कि SQL सर्वर के भविष्य के संस्करण में सिस्टम टेबल तक पहुंच बंद हो सकती है। इसके बजाय स्कीमा विचारों का उपयोग करें।
ओलिवियर जैकोट-डेसकॉम्ब्स

10

यदि आपको विभिन्न डेटाबेस पर काम करने की आवश्यकता है:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END

1
क्या आपको यकीन है? मेरे 2005 बॉक्स पर सूचना स्कीमा केवल वर्तमान कैटलॉग लौटाता है।
क्विलब्रेकर

8

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर आप इसे अक्सर कॉल करने की योजना बनाते हैं तो मुझे यह संभावना मिल गई है।

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

9
-1। इसके लिए एक प्रक्रिया के रूप में व्यर्थ है क्योंकि यह कॉल करने और रिटर्न का उपभोग करने के लिए उतना ही कोड है जितना कि चयन करने के लिए। sysnameडेटाटाइप का उपयोग नहीं करना चाहिए varchar(50)। पदावनत sysobjectsदृश्य का उपयोग नहीं करना चाहिए और स्कीमा का कोई हिसाब नहीं लेना चाहिए।
मार्टिन स्मिथ

6

आप नीचे दिए गए कोड का उपयोग कर सकते हैं

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

या

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

5

डेवलपर्स और साथी डीबीए के लाभ के लिए, बस यहां जोड़ना

एक स्क्रिप्ट जो @Tablename को एक पैरामीटर के रूप में प्राप्त करती है

(जो स्कीमनाम में शामिल हो भी सकता है और नहीं भी) और नीचे दी गई जानकारी लौटाता है यदि स्कीमा.टेबल मौजूद है:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

मैंने इस स्क्रिप्ट का उपयोग अन्य लिपियों के अंदर करने के लिए किया है, जब भी मुझे परीक्षण करने की आवश्यकता होती है कि मेज या दृश्य मौजूद है या नहीं, और जब ऐसा होता है, तो इसके object_id को अन्य उद्देश्यों के लिए उपयोग किया जाता है।

जब आप खाली स्ट्रिंग, गलत स्कीमा नाम या गलत तालिका नाम पारित करते हैं तो यह एक त्रुटि उठाता है।

यह एक प्रक्रिया के अंदर हो सकता है और उदाहरण के लिए -1 लौटा सकता है।

उदाहरण के रूप में, मेरे पास मेरे डेटा वेयरहाउस डेटाबेस में से एक में "Facts.FactBackOrder" नामक एक तालिका है।

मैंने इसे कैसे हासिल किया:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 

आपकी लिपि में बहुत सारी मान्यताएँ हैं। उदाहरण के लिए, मैं आसानी से नाम की एक तालिका को सक्रिय कर सकता हूं dbo.[hello.world ]और स्क्रिप्ट को कई कारणों से नहीं मिलेगा। उस ने कहा, यह संभावना नहीं है कि कोई भी ऐसी तालिका बनाना चाहेगा, लेकिन फिर भी। वैसे भी, आपके THE_NAMEकॉलम को sysname', yet you try to squeeze 2 sysname` कॉलम और एक डॉट ( .) के रूप में परिभाषित किया गया है , सभी चौकोर कोष्ठक में घिरे हुए हैं ... जो किसी दिन विफल होने के लिए बाध्य है!
10

@deroby मैं सहमत हूँ कि sysname उपयोग करने के लिए सबसे अच्छा डेटा प्रकार नहीं है, फिर भी स्क्रिप्ट लंबे समय से बिना किसी त्रुटि के चल रही है, मैं उस पर केवल तभी समय बिताऊंगा जब मुझे एक उचित स्थिति मिलेगी जहां यह काम नहीं करता है। इससे भी बेहतर, आप इस कोड को लेते हैं, इसे सुधारते हैं और इसे उत्तर के रूप में यहां पोस्ट करते हैं और मैं इसका परीक्षण करूंगा, अगर यह काम करता है तो मैं आपके उत्तर को बढ़ा दूंगा।
Marcello Miorelli

5

में SQL Server 2000 तुम कोशिश कर सकते हैं:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END

3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)

2

किसी के लिए जानना महत्वपूर्ण है जिसने अभी तक अपना समाधान नहीं पाया है: SQL सर्वर! = MYSQL । यदि आप इसे MYSQL के साथ करना चाहते हैं , तो यह काफी सरल है

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

इसे यहां पोस्ट करना क्योंकि यह Google पर शीर्ष हिट है।


4
-1 क्योंकि ओपी समस्या के लिए SQL सर्वर समाधान के लिए ठीक पूछ रहा है, न कि MySQL एक। उन्होंने MySQL के बारे में लिखा क्योंकि वह उस DBMS पर समाधान जानता था और वह SQL सर्वर पर भी यही परिणाम चाहता था। इसके अलावा आपका जवाब भी MySQL क्वेरी नहीं है, लेकिन एक PHP कोड जो MySQL के साथ काम करता है।
मोर्डैक 550

1
@ mordack550, मैं Blauhirn से सहमत हूं। वह सही है। यह पता लगाने के लिए Google पर शीर्ष हिट है कि क्या SQL में कोई तालिका मौजूद है। वह इरादे नेक हैं और उनकी जानकारी मददगार है। +1
मार्क

यह दुर्भाग्यपूर्ण है कि Microsoft को SQL जैसे सामान्य मानकों और पैटर्न को अपनाने / बढ़ाने / बुझाने की आदत है। मैं वास्तव में चाहता हूं कि उन्होंने एक SQL सर्वर को एक उचित नाम दिया है ताकि लोग उनके उत्पाद के लिए विशिष्ट संदर्भों की पहचान कर सकें।
Psaxton


2

आप इसका उपयोग कर सकते हैं:

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
        BEGIN 
            print 'deleted table';
            drop table t 
        END
     else 
        begin 
            print 'table not found' 
        end

 Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
 insert into t( name, lastname) values('john','doe');
 insert into t( name, lastname) values('rose',NULL);

 Select * from t
1   john    doe
2   rose    NULL

 -- clean
 drop table t


1

- - तालिका मौजूद है या नहीं, यह जाँचने के लिए प्रक्रिया बनाएँ


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - कैसे उपयोग करें: जाँच करें कि क्या टेबल माइग्रेशन मौजूद है


 CALL checkIfTableExists('muDbName', 'migrations', @output);


1

मैं यहाँ उदाहरण के रूप में एक दृश्य बना रहा हूँ ।

क्योंकि ALTER / CREATE कमांड BEGIN / END ब्लॉकों के भीतर नहीं हो सकता। आपको अस्तित्व बनाने के लिए परीक्षण करने की जरूरत है और इसे बनाने से पहले ड्रॉप करें

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

यदि आप खो जाने की अनुमति के बारे में चिंतित हैं, तो आप GRANT स्टेटमेंट को स्क्रिप्ट के रूप में अच्छी तरह से लिख सकते हैं और अंत में उन्हें फिर से चला सकते हैं।

आप एक स्ट्रिंग में बदलाव / परिवर्तन कर सकते हैं और एक EXEC कर सकते हैं - जो बड़े दृश्यों के लिए बदसूरत हो सकता है

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL

0

यदि कोई भी linq में sql (या विशेष रूप से linqpad) में यही काम करने की कोशिश कर रहा है, तो सिस्टम तालिकाओं और विचारों को शामिल करने के लिए विकल्प चालू करें और इस कोड को करें:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

यह देखते हुए कि आपके पास आइटम में एक नाम है, जिसे आइटम कहा जाता है, और स्कीमा में एक संपत्ति जिसे स्कीमा कहा जाता है, जहां स्रोत चर नाम है a


0

यदि यह 'अंतिम' चर्चा है, तो यह ध्यान दिया जाना चाहिए कि लैरी लियोनार्ड की स्क्रिप्ट दूरस्थ सर्वर के साथ-साथ सर्वर से जुड़े होने पर क्वेरी कर सकती है।

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

शायद यह लियोनार्ड के जवाब के लिए एक टिप्पणी के रूप में जोड़ना संभव है या शायद एक संपादन के रूप में?
EWit

0

मुझे INFORMATIONAL_SCHEME और OBJECT_ID से चयन के साथ कुछ समस्याएं हैं। मुझे नहीं पता कि यह ओडीबीसी ड्राइवर का मुद्दा है या कुछ और .. SQL प्रबंधन स्टूडियो के प्रश्न, दोनों, ठीक थे।

यहाँ समाधान है:

SELECT COUNT(*) FROM <yourTableNameHere>

इसलिए, यदि क्वेरी विफल हो जाती है, तो डेटाबेस में ऐसी कोई तालिका नहीं है, (या आपके पास इसकी अनुमति नहीं है)।

चेक SQL निष्पादक द्वारा दिए गए मान (पूर्णांक मेरे मामले में) की तुलना करके किया जाता है जो ODBC ड्राइवर के साथ काम करता है।

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

क्या उत्पादन के साथ विफल रहता है?
6:22

@wscourge, SQL क्वेरी विफल या कुछ समान है। मैं बस निष्पादक फ़ंक्शन से वापसी मान की जांच करता हूं।
माइकल क्वाड

इसे अपने उत्तर में जोड़ें
मिटा दें

0

यह जाँचने के लिए एक और विकल्प है कि क्या तालिका डेटाबेस में मौजूद है

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END

-1

डेटाबेस में तालिका मौजूद है या नहीं यह जाँचने के लिए इस क्वेरी को चलाएँ:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';

-6

एक डेटाबेस में विचार करें कि आपके पास एक टेबल t1 है। आप अन्य डेटाबेस पर स्क्रिप्ट चलाना चाहते हैं जैसे - यदि t1 मौजूद है, तो t1 बनाने के अलावा और कुछ भी न करें। इस दृश्य स्टूडियो को खोलने के लिए और निम्न कार्य करें:

T1 पर राइट क्लिक करें, फिर स्क्रिप्ट टेबल के रूप में, फिर DROP और क्रिएट टू, फिर न्यू क्वेरी एडिटर

आपको अपनी वांछित क्वेरी मिल जाएगी। लेकिन उस स्क्रिप्ट को निष्पादित करने से पहले क्वेरी में ड्रॉप स्टेटमेंट पर टिप्पणी करना न भूलें क्योंकि आप पहले से ही एक नया बनाना नहीं चाहते हैं।

धन्यवाद


SSMS 2012 में यह अब मौजूद मौजूद चेक नहीं करता है, अगर उसने कभी ऐसा किया है (मुझे याद नहीं है कि पूर्व संस्करणों ने उपरोक्त स्क्रिप्ट कैसे बनाई थी)। हो सकता है कि आप जिस तरह से अन्य डीबी उपकरण पटकथा वस्तुओं को पटक रहे हैं, उससे आप गलत हैं?
इवलो स्लावोव

यदि आप इसे पूछते हैं, तो SSMS यदि मौजूद है, तो प्रदर्शन करेगा। उपकरण> विकल्प> एसक्यूएल सर्वर ऑब्जेक्ट एक्सप्लोरर> स्क्रिप्टिंग> "ऑब्जेक्ट स्क्रिप्टिंग विकल्प": "ऑब्जेक्ट अस्तित्व की जांच करें" = सच
सीन अलेक्जेंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.