Algo como esto:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
pero para índices.
Algo como esto:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
pero para índices.
Respuestas:
Puede hacerlo usando una selección sencilla como esta:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
.
YourTableName
debería ser el nombre completo con esquema
Para SQL 2008 y versiones posteriores , un método más conciso, codificado, para detectar la existencia del índice es mediante el uso de la INDEXPROPERTY
función integrada:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
El uso más simple es con la IndexID
propiedad:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Si el índice existe, lo anterior devolverá su ID; si no lo hace, volverá NULL
.
AdaTheDEV, usé tu sintaxis y creé lo siguiente y por qué.
Problema: el proceso se ejecuta una vez al trimestre y tarda una hora debido a la falta de índice.
Corrección: Alterar el proceso de consulta o el Procedimiento para verificar el índice y crearlo si falta ... El mismo código se coloca al final de la consulta y el procedimiento para eliminar el índice, ya que no es necesario sino trimestralmente. Mostrando solo la sintaxis de soltar aquí
-- 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
Una ligera desviación de la pregunta original, aunque puede resultar útil para futuras personas que aterrizan aquí que quieren DROP
y CREATE
un índice, es decir, en un script de implementación.
Puede omitir la verificación existente simplemente agregando lo siguiente a su declaración de creación:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Lea más aquí: CREATE INDEX (Transact-SQL) - Cláusula DROP_EXISTING
Nota: Como se mencionó en los comentarios, el índice ya debe existir para que esta cláusula funcione sin generar un error.
Si el propósito oculto de su pregunta es DROP
el índice antes de hacer INSERT
una tabla grande, entonces esto es útil:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Esta sintaxis está disponible desde SQL Server 2016. Documentación para IF EXISTS
:
En caso de que trabaje con una clave primaria, use esto:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Escribió la siguiente función que me permite verificar rápidamente para ver si existe un índice; funciona igual que 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
EDITAR: Esto solo devuelve el OBJECT_ID de la tabla, pero será NULL si el índice no existe. Supongo que podría configurar esto para devolver index_id, pero eso no es súper ú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 comprobar que el índice agrupado existe en una tabla en particular o no:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')