यह आलेख यह जाँचने के लिए पाँच विकल्प प्रदान करता है कि SQL सर्वर में कोई तालिका मौजूद है या नहीं। अधिकांश विकल्पों में सिस्टम दृश्य को क्वेरी करना शामिल होता है, लेकिन विकल्पों में से एक सिस्टम संग्रहीत कार्यविधि को निष्पादित करता है, और दूसरे में एक फ़ंक्शन शामिल होता है।
मैं कुछ सरल IF
. भी शामिल करता हूं ऐसे कथन जिन्हें आपकी परिस्थिति के अनुरूप संशोधित किया जा सकता है।
विकल्प 1 - sys.tables देखें
यह विकल्प sys.tables
. से पूछताछ करता है सिस्टम कैटलॉग दृश्य। यह दृश्य प्रत्येक उपयोगकर्ता तालिका के लिए एक पंक्ति देता है। इसलिए, आप जिस तालिका नाम की जांच कर रहे हैं उसका उपयोग करके आप इसे क्वेरी कर सकते हैं।
उदाहरण:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
परिणाम:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
आप उन चीज़ों में स्कीमा नाम भी जोड़ सकते हैं जिनकी आप जाँच कर रहे हैं। स्कीमा नाम शामिल करने के लिए पिछली क्वेरी को संशोधित करने का तरीका यहां दिया गया है:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
परिणाम:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
ध्यान दें कि sys.tables
व्यू केवल स्कीमा आईडी लौटाता है इसलिए मुझे इसे SCHEMA_NAME()
. पर पास करना पड़ा अपना नाम प्राप्त करने के लिए कार्य करता है। वैकल्पिक रूप से अगर मुझे पता होता तो मैं स्कीमा आईडी का उपयोग कर सकता था।
उदाहरण:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
परिणाम:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
विकल्प 2 - sp_tables संग्रहित प्रक्रिया
अगला विकल्प sp_tables
. को निष्पादित करता है संग्रहीत प्रक्रिया।
यहां बताया गया है कि इस पद्धति का उपयोग करते समय आपका कोड कितना संक्षिप्त हो सकता है:
sp_tables 'Artists'
परिणाम:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
हालाँकि, यह संग्रहीत कार्यविधि दृश्यों के साथ-साथ तालिकाओं को भी लौटाती है, इसलिए इसे केवल तालिकाओं तक सीमित करना एक अच्छा विचार है (जब तक कि आप दृश्य वापस करने में रुचि नहीं रखते)। इसे केवल तालिकाओं तक सीमित करने के लिए, @table_type = "'TABLE'"
. का उपयोग करें .
जब आप इसमें हों, तब आप टेबल के मालिक और टेबल क्वालिफायर को भी निर्दिष्ट कर सकते हैं।
उदाहरण:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
परिणाम:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
यह नोट करना महत्वपूर्ण है कि @table_type
पैरामीटर अल्पविराम से अलग की गई सूची को स्वीकार करता है। इसलिए, यह अन्य मापदंडों से थोड़ा अलग है। @table_type
मूल्य दोहरे उद्धरण चिह्नों में संलग्न होना चाहिए, और प्रत्येक आइटम एकल उद्धरणों में संलग्न होना चाहिए। मेरे उदाहरण में, केवल एक सूची आइटम है, हालांकि, इसे अभी भी डबल और सिंगल कोट्स दोनों में संलग्न करने की आवश्यकता है।
विकल्प 3 - INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
सिस्टम व्यू वर्तमान डेटाबेस में प्रत्येक तालिका या दृश्य के लिए एक पंक्ति देता है जिसके लिए वर्तमान उपयोगकर्ता की अनुमति है। यह sys.tables
. के समान है , लेकिन यह कम कॉलम देता है। SQL सर्वर में शामिल सूचना स्कीमा दृश्य INFORMATION_SCHEMA के लिए ISO मानक परिभाषा का अनुपालन करते हैं।
वर्तमान डेटाबेस में कोई तालिका मौजूद है या नहीं यह जांचने के लिए इसका उपयोग करने का एक उदाहरण यहां दिया गया है:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
परिणाम:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
यहाँ यह फिर से है, लेकिन इस बार मैं स्कीमा भी निर्दिष्ट करता हूँ:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
परिणाम:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
विकल्प 4 - OBJECT_ID() फ़ंक्शन
आप OBJECT_ID()
. जैसे फ़ंक्शन का भी उपयोग कर सकते हैं यह देखने के लिए कि क्या यह एक गैर-शून्य मान देता है।
उदाहरण:
SELECT OBJECT_ID('Artists', 'U') AS Result;
परिणाम:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
इस मामले में, तालिका मौजूद है। ध्यान दें कि मैंने U
. का उपयोग किया है ऑब्जेक्ट प्रकार (उपयोगकर्ता-परिभाषित तालिका) को इंगित करने के लिए।
आप डेटाबेस और स्कीमा को शामिल करने के लिए तीन भागों का नाम भी दे सकते हैं:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
परिणाम:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
यदि तालिका मौजूद नहीं है, तो आपको NULL
मिलेगा :
SELECT OBJECT_ID('Oops!', 'U') AS Result;
परिणाम:
+----------+ | Result | |----------| | NULL | +----------+
IF
. में इसका उपयोग करने के उदाहरण के लिए नीचे देखें बयान।
विकल्प 5 - sys.objects देखें
जैसे कि पिछले उदाहरणों में से कोई भी काम नहीं करेगा, यह जांचने का एक और तरीका है कि कोई तालिका मौजूद है या नहीं।
इस बार मैं sys.objects
. को क्वेरी करता हूं सिस्टम कैटलॉग दृश्य। यह दृश्य डेटाबेस में प्रत्येक उपयोगकर्ता-परिभाषित, स्कीमा-स्कोप्ड ऑब्जेक्ट के लिए एक पंक्ति देता है। यह केवल टेबल नहीं लौटाता है, यह सभी प्रकार की वस्तुओं को लौटाता है। इसलिए हमें इसे केवल तालिकाओं तक सीमित करने की आवश्यकता है। इस मामले में मुझे केवल उपयोगकर्ता-परिभाषित तालिकाओं में दिलचस्पी है, इसलिए मैं type = 'U'
का उपयोग कर सकता हूं (U
"USER_TABLE" के लिए है)। वैकल्पिक रूप से, आप TYPE_DESC = 'USER_TABLE'
. का उपयोग कर सकते हैं ।
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
परिणाम:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
यहाँ यह फिर से है, लेकिन स्कीमा निर्दिष्ट कर रहा है:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
परिणाम:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
विकल्प 6 - sys.sysobjects View (AVOID)
यह विकल्प केवल इसलिए सूचीबद्ध है ताकि मैं इसका उपयोग करने के विरुद्ध अनुशंसा कर सकूं। sys.sysobjects
बैकवर्ड संगतता के लिए दृश्य SQL सर्वर में शामिल है, और Microsoft अनुशंसा करता है कि आप भविष्य के कार्य में इस दृश्य का उपयोग करने से बचें।
यदि आपको ऐसा कोड मिलता है जो इस दृश्य का उपयोग करता है, तो इसे sys.objects
. का उपयोग करने के लिए संशोधित करने पर विचार करें या कोई अन्य सिस्टम दृश्य या संग्रहीत कार्यविधि।
किसी भी स्थिति में, sys.sysobjects
का उपयोग करने पर पिछला उदाहरण ऐसा दिखाई दे सकता है sys.objects
. के बजाय ।
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
परिणाम:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF स्टेटमेंट 1
यहां एक आसान IF
है बयान जो तालिका के अस्तित्व की जांच करता है, फिर परिणाम के आधार पर एक अलग संदेश प्रिंट करता है। इस कोड को आपकी विशिष्ट आवश्यकताओं के अनुरूप संशोधित किया जा सकता है।
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
परिणाम:
The table exists
और जब तालिका मौजूद नहीं होती है तो यह कैसा दिखता है:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
परिणाम:
The table does not exist
IF स्टेटमेंट 2
यह रहा एक और IF
कथन जिसे आपकी विशिष्ट आवश्यकताओं के अनुरूप संशोधित किया जा सकता है।
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
परिणाम:
The table exists