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


130

मैं SQL Server 2008 में संग्रहीत कार्यविधि लिख रहा हूँ। मुझे यह जाँचने की आवश्यकता है कि क्या डेटाबेस में कोई तालिका मौजूद है। अगर यह नहीं है तो मुझे इसे बनाने की आवश्यकता है।

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


2
संबंधित, यदि डुप्लिकेट नहीं है: जाँच करें कि क्या तालिका SQL सर्वर में मौजूद है

1
यह एक महान प्रश्न है जो SQL सर्वर के साथ काम करने वाले हर व्यक्ति अंततः पूछेगा। यह दुखद है कि एसक्यूएल सर्वर के पास मैत्रीपूर्ण ओरेकल स्टाइल क्रिएट या रिप्लाई नहीं है
दावोस

1
MySQL के लिए आप उपयोग कर सकते हैंCREATE TABLE IF NOT EXISTS ...
जॉन Henckel

जवाबों:


148

कुछ इस तरह

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

1
* के बजाय एक अनुक्रमित क्षेत्र का उपयोग करके कुछ निष्पादन (निष्पादन योजना के लिए) पर विचार करें (ऑब्जेक्ट_id इस तालिका में आमतौर पर संदर्भित संख्यात्मक क्षेत्र है) टाइप का उपयोग करें = 'U' के बजाय टाइप में (N'U ') (कॉलम _type Nchar का उपयोग करने वाले चार प्रकार का है एक अंतर्निहित रूपांतरण का कारण बनता है जो अक्सर if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
कार्डिनैलिटी

153

इसके विपरीत, मुझे ऑब्जेक्ट_आईडी फ़ंक्शन का उपयोग करना पसंद है जैसा कि नीचे दिखाया गया है। यह पढ़ना थोड़ा आसान है, और आपको 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'

2
मैं आमतौर पर इस्तेमाल की जाने वाली दूसरी विधि (एसआईएस टेबल की जांच) देखता हूं लेकिन यह अयस्क सुपाठ्य और कॉम्पैक्ट लगता है। क्या इस कारण को स्वीकार किए गए उत्तर पर इस पद्धति को पसंद नहीं करना है? (जैसे विभिन्न DB प्रदाताओं, गति, आदि के लिए SQL प्रवासन के साथ संगतता समस्याएँ)?
jedd.ahyoung

16

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

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 दृश्य विभिन्न RDBMS प्रणालियों में पोर्टेबल हैं, इसलिए विभिन्न RDBMS को पोर्ट करने के लिए किसी भी परिवर्तन की आवश्यकता नहीं है।

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

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

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

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

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.Objects, Sys.objectsकैटलॉग दृश्य को बेस दृश्य के रूप sys.Tablesमें संदर्भित किया जाता है जहां से व्युत्पन्न दृश्य के रूप में संदर्भित किया जाता है। Sys.Tablesकेवल टेबल ऑब्जेक्ट्स के लिए पंक्तियों को वापस करेगा जबकि टेबल ऑब्जेक्ट्स के लिए पंक्तियों को वापस करने के Sys.Objectअलावा देखें, यह ऑब्जेक्ट्स के लिए पंक्तियों को लौटाता है जैसे: संग्रहीत, विचार आदि।

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

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

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/


यह ध्यान रखना महत्वपूर्ण है कि यह उत्तर प्रदान करता है कि किस दृष्टिकोण को डेटाबेस को निर्दिष्ट करने की आवश्यकता है और जो नहीं करता है। यह अत्यंत मूल्यवान है और स्क्रिप्ट के लिए जो एक ऑपरेशनल डेटाबेस को सेटअप और अपडेट करने के लिए चलती है जब एक ही उदाहरण पर एक ही डेटाबेस के कई भाग चल रहे हों, तो यह कुंजी है! बेहतरीन जानकारी।
नेल्दा.टेकस्पैरेसी

11

संपादित

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

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

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

END


1
Declare @Username varchar(20)
Set @Username = 'Mike'

if not exists 
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')

Begin
    Create table tblEmp (ID int primary key, Name varchar(50))
    Print (@Username + ' Table created successfully')
End

Else

Begin
    Print (@Username + ' : this Table Already exists in the database')
End

1
StackOverflow में आपका स्वागत है। प्रश्नों का उत्तर देते समय, एक स्पष्टीकरण जोड़ने पर भी विचार करें। अधिकांश समय अकेले कोड बहुत उपयोगी नहीं होता है।
विक्टर

0

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

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

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


3
जबकि वह वाक्य रचना काम करेगी, sysobjectsएक संगतता दृश्य है जो केवल पुराने कोड को तोड़ने से बचने के लिए मौजूद है। मेरे सुझाव उपयोग प्रणाली सूची विचारों (जैसे होगा sys.objects, sys.tablesकोड के लिए) है कि केवल एसक्यूएल सर्वर को लक्ष्य 2008 उदाहरणों, और जानकारी स्कीमा विचारों (जैसे information_schema.tablesकोड के लिए) है कि जरूरतों को पोर्टेबल होने के लिए। आप विभिन्न विचारों के बारे में अधिक जानकारी यहाँ पा सकते हैं: SQL सर्वर सिस्टम कैटलॉग को
छोड़ना

-2

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

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

2
यदि टेबल मौजूद है, लेकिन खाली है, तो यह उस स्थिति में सही होगा
SQLMenace

@ SQLMeance ओह ठीक है, मैं आपके जवाब से समझता हूं कि आप sys.objects में 'U' टाइप की जाँच कर रहे हैं, क्या आप मुझे यह समझने में मदद कर सकते हैं, आप इसकी सलाह क्यों देते हैं? और क्या एक टेबल कहीं और मौजूद हो सकती है? अग्रिम धन्यवाद
RaM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.