บางสิ่งเช่นนี้
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
ควรจะเป็นชื่อเต็มกับสคี
สำหรับSQL 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);
อ่านเพิ่มเติมได้ที่นี่: สร้างดัชนี (Transact-SQL) - DROP_EXISTING Clause
หมายเหตุดังที่ได้กล่าวไว้ในความคิดเห็นดัชนีต้องมีอยู่แล้วเพื่อให้ประโยคนี้ทำงานได้โดยไม่ผิดพลาด
หากจุดประสงค์ที่ซ่อนอยู่ของคำถามของคุณคือDROP
ดัชนีก่อนสร้างINSERT
ตารางขนาดใหญ่แสดงว่าสิ่งนี้มีประโยชน์หนึ่งซับ:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
ไวยากรณ์นี้มีให้ตั้งแต่ SQL Server 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 หากไม่มีดัชนีอยู่ ฉันคิดว่าคุณสามารถตั้งค่านี้ให้ส่งคืน 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')