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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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

  2. #2
    Membre éprouvé

    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
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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 ?

  4. #4
    Membre éprouvé

    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
    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 éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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
    Membre éprouvé

    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
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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.

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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 ?

  11. #11
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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 éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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.

  14. #14
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    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

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

  17. #17
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 45
    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 éprouvé Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Par défaut
    Apparemment ça fait l'affaire
    Merci

+ 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