यह जांचने के लिए कि तालिका मौजूद है या नहीं और यदि यह मौजूद नहीं है तो SQL सर्वर 2008 में तालिका बनाएं




sql-server tsql (7)

अगर मैं गलत नहीं हूं, तो यह काम करना चाहिए:

    if not exists (Select 1 from tableName)
create table ...

https://code.i-harness.com

मैं एसक्यूएल सर्वर 2008 में एक Stored procedure लिख रहा हूं, मुझे यह जांचने की ज़रूरत है कि डीबी में कोई table मौजूद है या नहीं, अगर ऐसा नहीं है तो मुझे इसे बनाना होगा।

मैं यह कैसे करुं?


आइए नीचे दी गई स्क्रिप्ट द्वारा तालिका के साथ नमूना डेटाबेस बनाएं:

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))

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

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

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

उपर्युक्त क्वेरी वर्तमान डेटाबेस में सभी स्कीमा में tblTest तालिका के अस्तित्व की जांच करती है। इसके बजाय यदि आप किसी निर्दिष्ट स्कीमा और निर्दिष्ट डेटाबेस में तालिका के अस्तित्व की जांच करना चाहते हैं तो हम उपरोक्त क्वेरी को नीचे के रूप में लिख सकते हैं:

IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo'  AND TABLE_NAME = N'tblTest')
BEGIN
  PRINT 'Table Exists'
END

इस दृष्टिकोण के पेशेवर: INFORMATION_SCHEMA विचार विभिन्न आरडीबीएमएस सिस्टम में पोर्टेबल हैं, इसलिए विभिन्न आरडीबीएमएस को पोर्ट करने के लिए किसी भी बदलाव की आवश्यकता नहीं है।

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

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

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

तालिका नाम के लिए डेटाबेस नाम और स्कीमा नाम भागों को निर्दिष्ट करना वैकल्पिक है। लेकिन डेटाबेस नाम और स्कीमा नाम निर्दिष्ट करना सभी स्कीमा में मौजूदा डेटाबेस में जांच करने के बजाय, निर्दिष्ट डेटाबेस में तालिका के अस्तित्व की जांच करने के लिए और निर्दिष्ट स्कीमा के भीतर एक विकल्प प्रदान करता है। नीचे दी गई क्वेरी से पता चलता है कि वर्तमान डेटाबेस मास्टर डेटाबेस है, फिर भी हम Test डेटाबेस में dbo स्कीमा में tblTest तालिका के अस्तित्व की जांच कर सकते हैं।

USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END

पेशेवर: याद रखना आसान है। OBJECT_ID() फ़ंक्शन के बारे में उल्लेख करने वाला एक अन्य उल्लेखनीय बिंदु यह है: यह वर्तमान कनेक्शन संदर्भ में बनाई गई अस्थायी तालिका के अस्तित्व की जांच करने का विकल्प प्रदान करता है। अन्य सभी दृष्टिकोण केवल वर्तमान कनेक्शन संदर्भ के बजाय सभी कनेक्शन संदर्भ में बनाए गए अस्थायी तालिका के अस्तित्व की जांच करते हैं। क्वेरी के नीचे OBJECT_ID() फ़ंक्शन का उपयोग करके अस्थायी तालिका के अस्तित्व की जांच कैसे करें:

CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
GO

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

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

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

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

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

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

Sys.Tables कैटलॉग व्यू Sys.Tables कैटलॉग व्यू से पंक्तियां प्राप्त करता है, Sys.objects कैटलॉग व्यू को बेस व्यू के रूप में जाना जाता है जहां sys.Tables को व्युत्पन्न दृश्य के रूप में जाना जाता है। Sys.Tables केवल पंक्तियों के लिए पंक्तियों को वापस कर देगा जबकि Sys.Object तालिका वस्तुओं के लिए पंक्तियों को वापस करने से अलग देखें, यह वस्तुओं के लिए पंक्तियां लौटाता है जैसे: संग्रहीत प्रक्रिया, विचार इत्यादि।

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

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

IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' 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/


कुछ इस तरह

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

BEGIN
CREATE TABLE [dbo].[YourTable](
    ....
    ....
    ....
) 

END

डेटाबेस में किसी तालिका के अस्तित्व की जांच के लिए निम्न कथन का प्रयास करें:

If not exists (select name from sysobjects where name = 'tablename')

यदि आप ब्लॉक के अंदर टेबल बना सकते हैं।


बस इसके विपरीत, मुझे नीचे दिखाए गए object_id फ़ंक्शन का उपयोग करना पसंद है। यह पढ़ने के लिए थोड़ा आसान है, और आपको sys.objects बनाम sysobjects बनाम sys.all_objects बनाम sys.tables के बारे में चिंता करने की ज़रूरत नहीं है। बुनियादी रूप:

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

बेशक यह उस नाम के साथ मौजूद कोई वस्तु मौजूद होने पर "वर्तमान" के रूप में दिखाया जाएगा। यदि आप केवल टेबल की जांच करना चाहते हैं, तो आपको इसकी आवश्यकता होगी:

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

यह अस्थायी तालिकाओं के लिए भी काम करता है:

IF object_id('tempdb.dbo.#MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

संपादित

अस्तित्व वांछित तालिका की जांच के लिए आप sys.tables में देख सकते हैं:

IF  NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')

BEGIN
CREATE TABLE [SchemaName].[YourTable](
    ....
    ....
    ....
) 

END

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END




sql-server-2008-r2