Bonjour
Existe-t-il un moyen via requête SQL de connaître si un champ d'une table est indexé ?
Et savoir aussi si le même champ est une clé primaire ?
Merci d'avance
Bonjour
Existe-t-il un moyen via requête SQL de connaître si un champ d'une table est indexé ?
Et savoir aussi si le même champ est une clé primaire ?
Merci d'avance
Salut,
regarde du côté de sp_helpindex, il faut en fait rechercher tout les index clés des tables de la base et ensuite chercher la présence de ton champs là dedans.
Lorsque j'essaie :j'ai le message d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sp_helpindex TotoAlors qu'elle existe bien.L'objet 'Toto' n'existe pas dans la base de données 'MaBase'
Peut-être ça vient du fait que le propriétaire de la table n'est pas 'dbo' ?
Pour les clés primaires, il faut que j'utilise la fonction :Puis je pensais plutôt avoir une vraie requête avec un SELECT. Pas possible ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part sp_pkeys @table_name = 'Toto', @table_owner = 'XYZ'
On pourrait certainement sortir quelque chose en faisant une requete sus sysobjects xtype = "PK" et syscolumns je cherche un peu je te dis si ça donne quelque chose.
Les infos sur les colonnes des tables sont dans la table syscolumns :
Une clé primaire est un index : il faut regarder du côté de sysindexes, c'est là que tu trouveras les objets 'PKquelqueChose' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select C.* from syscolumns C , sysobjects O where C.id = O.id and O.name='nomTable'
Il te reste à chercher les jointures qui vont bien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select I.* from sysindexes I , sysobjects O where I.id = O.id and O.name='nomTable' and I.name like 'PK[_]%'
Justement j'avais un peu cherché dans ce coin là mais je n'ai pas réussi à trouver comment avoir la liste de noms de champs pour les PK. Et pareillement pour la liste des champs indexés via la table sysindexes.
Merci au fait![]()
Oui effectivement... Il manque la table sysindexkeys
... et ca ne sert à rien depasser par sysindexes car on sait effectivement (merci DesMo) dans sysobjects que xtype='PK' : c'est plus propre !
Il faut voir aussi du côté de ça :
qui nous retourne "primary key"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select name from master.dbo.spt_values where type = 'I' and number = 2048
Ce qui m'intéresserait, c'est vraiment de faire une requête avec le nom du champ.
Cette requête me permet d'avoir le nom du champ primaire :Maintenant je cherche pour avoir les autres champs indexés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select C.name from syscolumns C , sysobjects O , sysindexes I , sysindexkeys K where C.id = O.id and O.name='Toto' And I.id = O.id and I.name like 'PK[_]%' And K.id = O.id And K.indid = I.indid And K.colid = C.colid
Merci.
J'ai fait cette requête, ça fonctionne :Par contre, je trouve ça un peu lourd, y a pas mieux à faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select C.name from syscolumns C , sysobjects O , sysindexes I , sysindexkeys K where C.id = O.id and O.name='Toto' And I.id = O.id and I.name not like '_WA%' And K.id = O.id And K.indid = I.indid And K.colid = C.colid And C.Name not in (select C.name from syscolumns C , sysobjects O , sysindexes I , sysindexkeys K where C.id = O.id and O.name='Toto' And I.id = O.id and I.name like 'PK[_]%' And K.id = O.id And K.indid = I.indid And K.colid = C.colid)
Je pense qu'on peut deja faire sans la sous-requete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select C.name from syscolumns C , sysobjects O , sysindexes I , sysindexkeys K where C.id = O.id and O.name='Toto' And I.id = O.id and I.name not like '_WA%' And K.id = O.id And K.indid = I.indid And K.colid = C.colid And O.xtype<>'PK'
... et une précision : un '_' dans un like correspond à n'importe quel caractère : il faut écrire '[_]'.
Merci pour le _ , je n'étais au courant.
Quant à la requête, merci mais ça affiche aussi le nom des champs qui sont en clé primaire dans la table.
Aieeffectivement... restons sur le test du nom alors...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select C.name from syscolumns C , sysobjects O , sysindexes I , sysindexkeys K where C.id = O.id and O.name='Toto' And I.id = O.id and I.name not like '[_]WA%' And K.id = O.id And K.indid = I.indid And K.colid = C.colid and I.name not like 'PK[_]%'
C'est ce que je faisais au début, mais comme je crée un index par clé primaire, ça affiche aussi les clés primaires
OK ça y est moi comprendre....![]()
Du coup on ne peut pas faire sans la sous-requête.
Moi j'écrirais ça commme ça :
Sur ce : bon WE !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT C.name FROM syscolumns C,sysobjects O,sysindexes I,sysindexkeys K WHERE C.id = O.id AND O.name = 'Toto' AND I.id = O.id AND I.name not like '[_]WA%' AND K.indid = i.indid AND K.id = O.id AND K.colid = C.colid AND not exists(SELECT * FROM sysindexes I2, sysindexkeys K2 WHERE I2.id=O.id AND K2.id=O.id AND K2.colid = C.colid AND I2.name like 'PK[_]%' AND K2.indid = I2.indid)![]()
Partager