এটার মতো কিছু:
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।
অ্যাডাএইডিডিভি, আমি আপনার সিনট্যাক্সটি ব্যবহার করেছি এবং নীচে এবং কেন তৈরি করেছি।
সমস্যা: সূচীর অনুপস্থিতির কারণে প্রক্রিয়াটি এক চতুর্থাংশে একবার সময় নেয়।
সংশোধন: সূচনা পরীক্ষা করার জন্য অনুপস্থিত অনুসন্ধানের প্রক্রিয়া বা অনুপস্থিত থাকলে এটি তৈরি করার পদ্ধতিটি পরিবর্তন করুন ... অনুরোধটি নয় তবে ত্রৈমাসিকের কারণে সূচি অপসারণের জন্য একই কোড ক্যোয়ারী এবং পদ্ধতির শেষে রাখা হয়েছে। এখানে কেবল ড্রপ সিনট্যাক্স দেখানো হচ্ছে
-- 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);
এখানে আরও পড়ুন: ক্রিট ইন্ডেক্স (লেনদেন-এসকিউএল) - DROP_EXISTING ধারা use
এনবি মন্তব্য হিসাবে উল্লিখিত হিসাবে, ত্রুটি নিক্ষেপ না করে এই দফাটি কাজ করার জন্য সূচকটি ইতিমধ্যে বিদ্যমান থাকতে হবে।
যদি আপনার প্রশ্নের গোপন উদ্দেশ্যটি কোনও বৃহত টেবিল 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 দেয়, তবে সূচকের অস্তিত্ব না থাকলে এটি NULL হবে। আমি মনে করি আপনি এটি সূচক_আইডি ফেরত দিতে সেট করতে পারেন তবে এটি কার্যকর নয়।
-- 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')