sql server - जांचें कि SQL सर्वर में तालिका मौजूद है या नहीं




sql-server tsql (14)

    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

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

जब आप उत्तर के लिए 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 सरल शो टैबलेट '% tablename%' की तरह प्रदान करता है; बयान। मैं कुछ इसी तरह की तलाश में हूं।


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

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);

एक अलग डेटाबेस पर एक टेबल की तलाश में:

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

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

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

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

धन्यवाद


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

दृष्टिकोण 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 सिस्टम तालिका का सीधे उपयोग करने से बचना चाहिए, इसके लिए सीधी पहुंच एसक्यूएल सर्वर के कुछ भविष्य के संस्करणों में बहिष्कृत हो जाएगी। माइक्रोसॉफ्ट बीओएल लिंक के अनुसार, माइक्रोसॉफ्ट 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/


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

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

बस एक ऐसी स्थिति का उल्लेख करना चाहता था जहां शायद 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;

एसक्यूएल सर्वर 2016 संपादित करें :

2016 से शुरू होने पर, माइक्रोसॉफ्ट ने छोड़ने से पहले अस्तित्वहीन वस्तुओं की जांच करने की क्षमता को सरल बना दिया, if exists बयानों को drop लिए if exists कीवर्ड if exists । उदाहरण के लिए,

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/


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

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

यदि कोई भी 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


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

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

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


SQL सर्वर 2000 में आप कोशिश कर सकते हैं:

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

IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

IF OBJECT_ID('mytablename') IS NOT NULL 




tsql