sql server - जांचें कि SQL सर्वर में तालिका मौजूद है या नहीं
sql-server tsql (14)
मैं 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%' की तरह प्रदान करता है; बयान। मैं कुछ इसी तरह की तलाश में हूं।
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
- - यह जांचने के लिए प्रक्रिया बनाएं कि कोई तालिका मौजूद है या नहीं
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
रैपर के समान ही काम करेगा।
मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर आप इसे अक्सर कॉल करने की योजना बनाते हैं तो मुझे यह संभावना मिली है।
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