Quelque chose comme ça:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
mais pour les index.
Quelque chose comme ça:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
mais pour les index.
Réponses:
Vous pouvez le faire en utilisant une sélection simple comme celle-ci:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
.
YourTableName
le nom doit être complet avec le schéma
Pour SQL 2008 et versions ultérieures , une méthode plus concise, au niveau du codage, pour détecter l'existence d'index consiste à utiliser la INDEXPROPERTY
fonction intégrée:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
L'utilisation la plus simple est avec la IndexID
propriété:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Si l'index existe, ce qui précède renverra son ID; sinon, il reviendra NULL
.
AdaTheDEV, j'ai utilisé votre syntaxe et créé ce qui suit et pourquoi.
Problème: le processus s'exécute une fois par trimestre en prenant une heure en raison de l'index manquant.
Correction: modifier le processus de requête ou la procédure pour vérifier l'index et le créer s'il manque ... Le même code est placé à la fin de la requête et la procédure pour supprimer l'index car il n'est pas nécessaire mais trimestriel. Afficher uniquement la syntaxe de dépôt ici
-- 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
Un léger écart par rapport à la question initiale peut toutefois se révéler utile pour les futurs atterrissage ici veulent DROP
et CREATE
un index, par exemple dans un script de déploiement.
Vous pouvez contourner la vérification existante simplement en ajoutant ce qui suit à votre instruction create:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
En savoir plus ici: CREATE INDEX (Transact-SQL) - Clause DROP_EXISTING
NB Comme mentionné dans les commentaires, l'index doit déjà exister pour que cette clause fonctionne sans générer d'erreur.
Si le but caché de votre question est DROP
l'index avant de créer INSERT
une grande table, alors ceci est utile à une ligne:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Cette syntaxe est disponible depuis SQL Server 2016. Documentation pour IF EXISTS
:
Dans le cas où vous traitez une clé de primery à la place, utilisez ceci:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
A écrit la fonction ci-dessous qui me permet de vérifier rapidement pour voir si un index existe; fonctionne exactement comme 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: Cela retourne juste le OBJECT_ID de la table, mais il sera NULL si l'index n'existe pas. Je suppose que vous pouvez définir cela pour renvoyer index_id, mais ce n'est pas super utile.
-- 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
Pour vérifier que l'index clusterisé existe sur une table particulière ou non:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')