IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQLServer2000]Savoir si un champ est indexé ou clé primaire


Sujet :

MS SQL Server

  1. #1
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut [SQLServer2000]Savoir si un champ est indexé ou clé primaire
    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 bouton si 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

  2. #2
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    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.

  3. #3
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Lorsque j'essaie : j'ai le message d'erreur :
    L'objet 'Toto' n'existe pas dans la base de données 'MaBase'
    Alors qu'elle existe bien.
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sp_pkeys @table_name = 'Toto', @table_owner = 'XYZ'
    Puis je pensais plutôt avoir une vraie requête avec un SELECT. Pas possible ?
    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 bouton si 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

  4. #4
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    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.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    Les infos sur les colonnes des tables sont dans la table syscolumns :
    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'
    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 I.* from sysindexes I , sysobjects O
    where I.id = O.id and O.name='nomTable' and I.name like 'PK[_]%'
    Il te reste à chercher les jointures qui vont bien...

  6. #6
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    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 bouton si 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

  7. #7
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    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 !

  8. #8
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    Il faut voir aussi du côté de ça :

    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
    qui nous retourne "primary key"

  9. #9
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    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 :
    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
    Maintenant je cherche pour avoir les autres champs indexés.
    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 bouton si 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

  10. #10
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    J'ai fait cette requête, ça fonctionne :
    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)
    Par contre, je trouve ça un peu lourd, y a pas mieux à faire ?
    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 bouton si 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

  11. #11
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    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'

  12. #12
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    ... et une précision : un '_' dans un like correspond à n'importe quel caractère : il faut écrire '[_]'.

  13. #13
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    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 bouton si 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

  14. #14
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    Aie effectivement... 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[_]%'

  15. #15
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    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 bouton si 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

  16. #16
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    OK ça y est moi comprendre....

  17. #17
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    Points : 48
    Points
    48
    Par défaut
    Du coup on ne peut pas faire sans la sous-requête.
    Moi j'écrirais ça commme ça :
    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)
    Sur ce : bon WE !

  18. #18
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    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 bouton si 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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir si un champ est compteur par req
    Par nanou9999 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/09/2006, 12h18
  2. [MySQL] Savoir si un champ est NULL ou pas
    Par Keulig dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/02/2006, 18h32
  3. Savoir si un champs est pk ou fk
    Par mic79 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 18/11/2004, 15h38
  4. [Access] Comment savoir qu'un champs est vide ?
    Par Oberown dans le forum ASP
    Réponses: 9
    Dernier message: 25/10/2004, 10h47
  5. [Requete] Savoir si un champ est remplit
    Par slowpoke dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/08/2003, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo