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
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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'
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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![]()
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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.
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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)
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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.
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
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)![]()
Apparemment ça fait l'affaire
Merci
Il vaut mieux prêter à sourire que donner à réfléchir.
Je ne réponds pas aux problèmes techniques par MP (il y a les FAQs et le forum pour ça)
(ex-Responsable Windows/Info Gen&Hardware, loup-garou à ses heures)
Cliquez sur le boutonsi votre problème a trouvé une solution.
N'oubliez pas non plus de donner la réponse si vous l'avez trouvée !
Je mords donc je suis
Une fine lame pour te soutenir
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager