कुछ इस तरह:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
लेकिन अनुक्रमित के लिए।
कुछ इस तरह:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
लेकिन अनुक्रमित के लिए।
जवाबों:
आप इसे इस तरह से सीधे आगे का चयन करके कर सकते हैं:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END।
YourTableNameस्कीमा के साथ पूरा नाम होना चाहिए
के लिए एसक्यूएल 2008 और नए , अधिक संक्षिप्त विधि, कोडिंग के लिहाज से, सूचकांक अस्तित्व का पता लगाने के लिए उपयोग करना है INDEXPROPERTYमें निर्मित समारोह:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
IndexIDसंपत्ति के साथ सबसे सरल उपयोग है :
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
यदि सूचकांक मौजूद है, तो उपरोक्त अपनी आईडी लौटा देगा; यदि ऐसा नहीं होता है, तो यह वापस आ जाएगी NULL।
AdaTheDEV, मैंने आपके सिंटैक्स का उपयोग किया और निम्नलिखित और क्यों बनाया।
समस्या: अनुक्रमणिका गुम होने के कारण एक घंटे में एक बार प्रक्रिया चलती है।
सुधार: अनुक्रमणिका के लिए जाँच करने और इसे बनाने और उसके बाद यदि अनुपस्थित हो, तो क्वेरी प्रक्रिया को बदलने की प्रक्रिया ... एक ही कोड को क्वेरी और प्रक्रिया के अंत में रखा गया है क्योंकि यह आवश्यक नहीं है लेकिन त्रैमासिक है। यहां केवल ड्रॉप सिंटैक्स दिखा रहा है
-- drop the index
begin
IF EXISTS (SELECT * FROM sys.indexes WHERE name='Index_Name'
AND object_id = OBJECT_ID('[SchmaName].[TableName]'))
begin
DROP INDEX [Index_Name] ON [SchmaName].[TableName];
end
end
हालांकि मूल प्रश्न से थोड़ा सा विचलन भविष्य के लोगों के लिए उपयोगी साबित हो सकता है , जो चाहते हैं DROPऔर CREATEएक तैनाती स्क्रिप्ट में, यानी एक सूचकांक।
आप अपने चेक स्टेटमेंट में निम्नलिखित जोड़कर मौजूद चेक को बायपास कर सकते हैं:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
यहाँ और पढ़ें: CREATE INDEX (Transact-SQL) - DROP_EXISTING क्लॉज
NB जैसा कि टिप्पणियों में उल्लेख किया गया है, इस खंड में त्रुटि के बिना काम करने के लिए सूचकांक पहले से मौजूद होना चाहिए।
यदि आपके प्रश्न का छिपा उद्देश्य एक बड़ी तालिका DROPबनाने INSERTसे पहले सूचकांक में है , तो यह उपयोगी एक-लाइनर है:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
यह सिंटैक्स SQL सर्वर 2016 के बाद से उपलब्ध है। इसके लिए दस्तावेज़ IF EXISTS:
यदि आप इसके बजाय प्राइमरी कुंजी से निपटते हैं, तो इसका उपयोग करें:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
नीचे फ़ंक्शन लिखा है जो मुझे यह देखने के लिए जल्दी से जांचने की अनुमति देता है कि क्या कोई सूचकांक मौजूद है; OBJECT_ID की तरह ही काम करता है।
CREATE FUNCTION INDEX_OBJECT_ID (
@tableName VARCHAR(128),
@indexName VARCHAR(128)
)
RETURNS INT
AS
BEGIN
DECLARE @objectId INT
SELECT @objectId = i.object_id
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID(@tableName)
AND i.name = @indexName
RETURN @objectId
END
GO
संपादित करें: यह केवल तालिका का OBJECT_ID लौटाता है, लेकिन यदि सूचकांक मौजूद नहीं है तो यह पूर्ण होगा। मुझे लगता है कि आप इसे index_id पर वापस लाने के लिए सेट कर सकते हैं, लेकिन यह सुपर उपयोगी नहीं है।
-- Delete index if exists
IF EXISTS(SELECT TOP 1 1 FROM sys.indexes indexes INNER JOIN sys.objects
objects ON indexes.object_id = objects.object_id WHERE indexes.name
='Your_Index_Name' AND objects.name = 'Your_Table_Name')
BEGIN
PRINT 'DROP INDEX [Your_Index_Name] ON [dbo].[Your_Table_Name]'
DROP INDEX [our_Index_Name] ON [dbo].[Your_Table_Name]
END
GO
जाँच करने के लिए क्लस्टर इंडेक्स विशेष टेबल पर मौजूद है या नहीं:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')