Bunun gibi bir şey:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
ancak dizinler için.
Bunun gibi bir şey:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
ancak dizinler için.
Yanıtlar:
Bunu, aşağıdaki gibi düz bir seçim kullanarak yapabilirsiniz:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
.
YourTableName
Şema ile tam adı olması gerektiğini belirtmek gerekir
İçin SQL 2008 ve daha yeni , daha özlü yöntemi endeks varlığını tespit etmek için, akıllıca kodlama kullanmaktır INDEXPROPERTY
yerleşik fonksiyonu:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
En basit kullanım IndexID
özelliği ile:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Dizin varsa, yukarıdakiler kimliğini döndürür; değilse, geri dönecektir NULL
.
AdaTheDEV, sözdizimini kullandım ve aşağıdakileri ve nedenini oluşturdum.
Sorun: İşlem, eksik dizin nedeniyle saatte bir çeyrek kez çalışıyor.
Düzeltme: Sorgu işlemini veya Dizini denetleme ve eksikse oluşturma yordamını değiştirin ... Aynı kod, sorgunun sonuna ve gerekmediği için üç ayda bir dizin kaldırma yordamının sonuna yerleştirilir. Buraya sadece bırak sözdizimi gösteriliyor
-- 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
Bununla birlikte, orijinal sorudan hafif bir sapma buraya gelmek isteyen gelecekteki insanlar DROP
ve CREATE
bir indeks, yani bir dağıtım betiği için yararlı olabilir .
Create deyiminize aşağıdakileri ekleyerek mevcut denetimi atlayabilirsiniz:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Daha fazla bilgiyi buradan edinebilirsiniz: CREATE INDEX (Transact-SQL) - DROP_EXISTING Yan tümcesi
Not Yorumlarda belirtildiği gibi, bu fıkranın bir hata atmadan çalışması için dizin zaten mevcut olmalıdır.
Sorunuzun gizli amacı büyük bir tabloya DROP
geçmeden önce dizine INSERT
yönelikse, bu tek satırlık yararlıdır:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Bu sözdizimi için SQL Server 2016 Dokümantasyon beri mevcuttur IF EXISTS
:
Bunun yerine bir primery anahtarıyla uğraşırsanız, bunu kullanın:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Bir dizinin var olup olmadığını hızlıca kontrol etmemi sağlayan aşağıdaki işlevi yazdı; tıpkı OBJECT_ID gibi çalışır.
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
EDIT: Bu sadece tablonun OBJECT_ID döndürür, ancak dizin yoksa NULL olur. Sanırım bu index_id dönmek için ayarlayabilirsiniz, ama bu süper yararlı değil.
-- 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
Kümelenmiş Dizin'in belirli bir tabloda var olup olmadığını kontrol etmek için:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')