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 :

Identifier les lignes responsables d'une viloation de contrainte de clé primaire


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut Identifier les lignes responsables d'une viloation de contrainte de clé primaire
    Je voudrais écrire une fonction (ou procédure stockée) qui me permettrait automatiquement d'identifier les enregistrements responsables d'une viloation de clé primaire.
    Je m'explique..

    Je voudrais passer le nom d'une table, ainsi que le (ou les) colonnes que j'utilise comme clé(s) primaire comme arguments et ressortir les enregistrements qui prevoquent un conflit de clé primaire.

    Ex:
    Table T
    --------
    Col1...Col2........Col3
    --------------------
    Jean...Dujardin....10
    Jean...Dujardin.....5
    Bob.....Dupont.....22
    Tom....Dupont.....22

    si je veux Col2 soit une clé primaire,
    My_function(T,Col2) retournerait:
    --------------------
    Bob....Dupont......22
    Tom...Dupont......22


    si je veux que le couple [Col1,Col2] soit ma clé primaire,
    My_function(T,Col1,Col2) retournerait:
    ---------------------
    Jean...Dujardin.....10
    Jean...Dujardin.....5



    ..ainsi de suite


    Le code sql pour chaque cas - séparément - est assez simple, mais comment traduire ceci en fonction générique??

    Merci ...

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    Si Col1 doit être la clé primaire cela devrait marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Col2, Col3
    From TableT
    Group By Col2, Col3
    Having Count(Col1) > 1

  3. #3
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour

    Ce matin, j'ai eu un problème avec mon script d'update de ma DB SQL et le sujet du mail est exactement ce que j'ai eu comme soucis : duplicate value with my primary key.

    Puis-je profiter de ce post et y inclure la question suivante : est-il possible dans une opération d'Insert de faire l'insertion des records "corrects" (soit non double) et de rediriger les doublons (vers un log, une table temporaire, ... peu importe) afin de permettre au script de continuer en excluant les records en double.

    Ce matin, mon script s'est planté et c'est tout l'update de ma DB qui a été stoppé. J'aurais aimé "mettre en quarantaine" uniquement le record fautif.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    avec un if(not exists(select.....)

    et ensuite la redirection avec if(exists(.....))

    les ..... étant remplacer par la requète pour trouver les doublons

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    Les amis je crois qu'on s'égare un peu du sujet initial

    Ce n'est pas un probléme de syntaxe Sql, mais plutôt d'écrire une fonction avec des paramétres enfonction de ce code sql..

    Le code sql est trés simple comme j'ai dit dans mon premier post (Merci Delphi-ne de l'avoir quand même rappelé)

    Mais comment faire pour que ma fonction prenne en entrée ma table T, ainsi que autant de colonnes que l'on veut - en fonction de la clé primaire que je veux..

    Merci

  6. #6
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    tu reprends simplement le code de delphine avec du sql dynamique.

    Je ne sais pas comment tu passes tes clés primaire ni tes tables comme paramètres.

    Mais je te conseillerais de mettre ta table dans une première variable, et ensuite tes clés dans un autre champs séparé par une ,

    Ensuite une petite concaténation de mise en forme, un sp_executesql, une variable de retour et voilà

Discussions similaires

  1. exclure les lignes blanches dans une requêtes
    Par sam01 dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/10/2006, 09h42
  2. Réponses: 4
    Dernier message: 01/10/2006, 15h37
  3. Réponses: 1
    Dernier message: 07/06/2006, 18h56
  4. Réponses: 5
    Dernier message: 19/05/2006, 16h11
  5. Identifier les enregistrements Lu d'une table
    Par aityahia dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/03/2006, 18h50

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