কোনও টেবিলে একটি নির্দিষ্ট সূচক বিদ্যমান কিনা আপনি কীভাবে পরীক্ষা করবেন?


288

এটার মতো কিছু:

SELECT
* 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'

তবে সূচকের জন্য।


11
আমার ইচ্ছা INFORMATION_SCHEMA এর কাছে সমস্ত স্কিমা তথ্য ছিল
অ্যালান ম্যাকডোনাল্ড

উত্তর:


480

আপনি স্ট্রেট ফরোয়ার্ড সিলেক্ট ব্যবহার করে এটি করতে পারেন:

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')

76
আপনি বিবৃতিটি একটিতে মোড়তে পারেন IF EXISTS(SELECT * ...) BEGIN ... END
বৌনাভ

26
YourTableNameস্কিমা সহ পুরো নাম হওয়া উচিত তা উল্লেখ করার মতো বিষয় রয়েছে
মেরেক

2
@ ব্লাস্টো আপনি যদি আমার বেশিরভাগ ক্ষেত্রে নন-ডিফল্ট স্কিমা ব্যবহার করেন তবে স্কিমাটিকে উপসর্গ হিসাবে উল্লেখ করা বাধ্যতামূলক। অন্য ক্ষেত্রে, আপনি এই প্রশ্নের কোনও ফলাফল পাবেন না
Marek

3
কোনও টেম্প টেবিলের বিরুদ্ধে চেক করতে, 'টেম্পিডবি.সাই.সিনডেক্সেস' এবং 'টেম্পডিবি .. # টেবিলনাম' ব্যবহার করতে পারেন। (
রেফার্ট জর্জন

7
কেবল যোগ করার জন্য: "এসকিউএল সার্ভার ২০১ 2016 থেকে শুরু করে আপনি ড্রপ ইন্ডেক্স ব্যবহার করতে পারেন যদি উপস্থিতি বাক্য গঠন থাকে" " এমএস ডকুমেন্টেশন
হারিংগার

100

জন্য এসকিউএল 2008 এবং নতুন , আরও সংক্ষিপ্ত পদ্ধতি, কোডিং ভিত্তিক সূচক অস্তিত্ব সনাক্ত করতে ব্যবহার করা INDEXPROPERTYবিল্ট-ইন ফাংশন:

INDEXPROPERTY ( object_ID , index_or_statistics_name , property )  

সবচেয়ে সহজ ব্যবহার IndexIDসম্পত্তি সহ:

If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null

যদি সূচকটি বিদ্যমান থাকে তবে উপরেরগুলি তার আইডি ফিরিয়ে দেবে; যদি তা না হয় তবে তা ফিরে আসবে NULL


71

অ্যাডাএইডিডিভি, আমি আপনার সিনট্যাক্সটি ব্যবহার করেছি এবং নীচে এবং কেন তৈরি করেছি।

সমস্যা: সূচীর অনুপস্থিতির কারণে প্রক্রিয়াটি এক চতুর্থাংশে একবার সময় নেয়।

সংশোধন: সূচনা পরীক্ষা করার জন্য অনুপস্থিত অনুসন্ধানের প্রক্রিয়া বা অনুপস্থিত থাকলে এটি তৈরি করার পদ্ধতিটি পরিবর্তন করুন ... অনুরোধটি নয় তবে ত্রৈমাসিকের কারণে সূচি অপসারণের জন্য একই কোড ক্যোয়ারী এবং পদ্ধতির শেষে রাখা হয়েছে। এখানে কেবল ড্রপ সিনট্যাক্স দেখানো হচ্ছে

-- 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

15

মূল প্রশ্ন থেকে সামান্য বিচ্যুতি তবে ভবিষ্যতে লোকেরা এখানে অবতরণ করতে DROPএবং CREATEসূচি হিসাবে অর্থাত্ একটি মোস্তাকির স্ক্রিপ্টে কার্যকর হতে পারে।

আপনার তৈরি বিবৃতিতে নিম্নলিখিতগুলি যুক্ত করে আপনি বিদ্যমান চেকটিকে বাইপাস করতে পারেন:

CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);

এখানে আরও পড়ুন: ক্রিট ইন্ডেক্স (লেনদেন-এসকিউএল) - DROP_EXISTING ধারা use

এনবি মন্তব্য হিসাবে উল্লিখিত হিসাবে, ত্রুটি নিক্ষেপ না করে এই দফাটি কাজ করার জন্য সূচকটি ইতিমধ্যে বিদ্যমান থাকতে হবে।


8
আসলে .. সাবধান! সূচকটি ইতিমধ্যে উপস্থিত না থাকলে এটি ব্যর্থ হবে! কমপক্ষে এসকিউএল সার্ভারে 2008.
আন্দ্রে কাইপভ

1
... এবং এটি এখনও এসকিউএল 2016
Magier

2
আরেকটি (সম্ভবত স্পষ্ট) প্রভাবটি হ'ল এটি সর্বদা সূচিটি পুনরায় তৈরি করবে। এটি আপনি যা চান তা নাও হতে পারে। একটি বৃহত টেবিলের উপর সূচি ফেলে এবং তৈরি করা একটি ব্যয়বহুল ক্রিয়াকলাপ - যদি বিদ্যমান সূচকটি ইতিমধ্যে আপনি চান তবে তা হয়। এই বিবৃতিটি এক-পদক্ষেপ প্রতিস্থাপনের জন্য ভাল। এটি বিদ্যমান সূচকটির সাথে তুলনা করে না - বরং একটি নিষ্ঠুর শক্তি "এটি করুন, বিদ্যমান থাকলেও - ফেলে দিন ... কেবল এটি করুন, সম্পন্ন করুন!" :-) এটি এখনও ওপি সন্ধান করছে এমন সমস্ত চেকিংয়ের প্রয়োজন। যাইহোক, যদি সূচকটি প্রতিস্থাপনের প্রয়োজন হয় তবে এটি ড্রপ / ক্রিয়েটকে একত্রিত করে।
রিপভ্লান

10

যদি আপনার প্রশ্নের গোপন উদ্দেশ্যটি কোনও বৃহত টেবিল DROPতৈরির আগে সূচকে থাকে INSERT, তবে এটি দরকারী ওয়ান-লাইনার:

DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]

এই সিনট্যাক্স থেকে জন্য SQL সার্ভার 2016 ডকুমেন্টেশন উপলব্ধ IF EXISTS:

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

পরিবর্তে আপনি যদি একটি প্রাইমারি কী ব্যবহার করেন তবে এটি ব্যবহার করুন:

ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name] 

7

নীচের ফাংশনটি লিখেছেন যা আমাকে দ্রুত সূচক উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখার অনুমতি দেয়; ঠিক 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 হবে। আমি মনে করি আপনি এটি সূচক_আইডি ফেরত দিতে সেট করতে পারেন তবে এটি কার্যকর নয়।


1
-- 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

-1

ক্লাস্টারড ইনডেক্স নির্দিষ্ট টেবিলে বিদ্যমান কিনা তা পরীক্ষা করতে:

SELECT * FROM SYS.indexes 
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')

5
এটি প্রাথমিক কী এবং অনন্য সীমাবদ্ধতাগুলি প্রদান করে তবে এগুলির কোনওটিই একটি ক্লাস্টার্ড সূচক নয়।
মার্ক সোওল

সূচি_আইডি = 1 ভুল যেখানে ভুল। সূচকটি আলাদা আইডি বরাদ্দ করতে পারে
ফুজিবিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.