मैं SQL Server 2008 में संग्रहीत कार्यविधि लिख रहा हूँ। मुझे यह जाँचने की आवश्यकता है कि क्या डेटाबेस में कोई तालिका मौजूद है। अगर यह नहीं है तो मुझे इसे बनाने की आवश्यकता है।
मैं यह कैसे करु?
CREATE TABLE IF NOT EXISTS ...
मैं SQL Server 2008 में संग्रहीत कार्यविधि लिख रहा हूँ। मुझे यह जाँचने की आवश्यकता है कि क्या डेटाबेस में कोई तालिका मौजूद है। अगर यह नहीं है तो मुझे इसे बनाने की आवश्यकता है।
मैं यह कैसे करु?
CREATE TABLE IF NOT EXISTS ...
जवाबों:
कुछ इस तरह
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 object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
इसके विपरीत, मुझे ऑब्जेक्ट_आईडी फ़ंक्शन का उपयोग करना पसंद है जैसा कि नीचे दिखाया गया है। यह पढ़ना थोड़ा आसान है, और आपको 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'
नीचे दी गई स्क्रिप्ट द्वारा तालिका के साथ एक नमूना डेटाबेस बनाते हैं:
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/
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
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
डेटाबेस में तालिका के अस्तित्व की जांच करने के लिए निम्नलिखित कथन का प्रयास करें:
If not exists (select name from sysobjects where name = 'tablename')
यदि आप ब्लॉक के अंदर तालिका बना सकते हैं।
sysobjects
एक संगतता दृश्य है जो केवल पुराने कोड को तोड़ने से बचने के लिए मौजूद है। मेरे सुझाव उपयोग प्रणाली सूची विचारों (जैसे होगा sys.objects
, sys.tables
कोड के लिए) है कि केवल एसक्यूएल सर्वर को लक्ष्य 2008 उदाहरणों, और जानकारी स्कीमा विचारों (जैसे information_schema.tables
कोड के लिए) है कि जरूरतों को पोर्टेबल होने के लिए। आप विभिन्न विचारों के बारे में अधिक जानकारी यहाँ पा सकते हैं: SQL सर्वर सिस्टम कैटलॉग को
अगर मैं गलत नहीं हूं, तो यह काम करना चाहिए:
if not exists (Select 1 from tableName)
create table ...