Algo assim:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
mas para índices.
Algo assim:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
mas para índices.
Respostas:
Você pode fazer isso usando uma seleção direta como esta:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END.
YourTableNamedeve ser o nome completo com esquema
Para o SQL 2008 e versões mais recentes , um método mais conciso, em termos de codificação, para detectar a existência de índice é usando a INDEXPROPERTYfunção interna:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
O uso mais simples é com a IndexIDpropriedade:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Se o índice existir, o acima retornará seu ID; caso contrário, retornará NULL.
AdaTheDEV, usei sua sintaxe e criei o seguinte e por quê.
Problema: o processo é executado uma vez por trimestre, levando uma hora devido à falta do índice.
Correção: Altere o processo de consulta ou o Procedimento para verificar o índice e criá-lo se estiver ausente ... O mesmo código é colocado no final da consulta e do procedimento para remover o índice, pois não é necessário, mas trimestralmente. Mostrando apenas soltar sintaxe aqui
-- 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
Um pequeno desvio da pergunta original, no entanto, pode ser útil para futuras pessoas que desembarcarem aqui que desejam DROPeCREATE um índice, ou seja, em um script de implantação.
Você pode ignorar a verificação existente simplesmente adicionando o seguinte à sua instrução create:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Leia mais aqui: CREATE INDEX (Transact-SQL) - Cláusula DROP_EXISTING
NB Como mencionado nos comentários, o índice já deve existir para que esta cláusula funcione sem gerar um erro.
Se o objetivo oculto da sua pergunta é DROPo índice antes de criar INSERTuma tabela grande, isso é útil:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Essa sintaxe está disponível desde o SQL Server 2016. Documentação para IF EXISTS :
Caso você lide com uma chave de primery, use o seguinte:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Escreveu a função abaixo que me permite verificar rapidamente se existe um índice; funciona exatamente como 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
EDIT: Isso apenas retorna o OBJECT_ID da tabela, mas será NULL se o índice não existir. Suponho que você possa definir isso para retornar index_id, mas isso não é super útil.
-- 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
Para verificar o índice clusterizado existe em uma tabela específica ou não:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')