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

Développement SQL Server Discussion :

SP Exists un record


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut SP Exists un record
    Bonjour,

    Je dois savoir si il existe deja un record dans une table ou non
    Pour l'instant je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAST(COUNT(*) AS bit)
    FROM myTable
    WHERE Col1 = @Col1
    Mais je me dit que c'est un peu bête car il doit parcourir tout les records de la table alors qu'il pourrait s'arrêter au premier record trouvé

    J'ai penser un TOP 1 mais si il n'y a pas de record le return est vide alors que je veux 0

    Avez-vous une idée?

    ps : Je suis en SQL Serveur

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    en utilisant un CASE, cela marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CASE WHEN COUNT(*) > 0 THEN 1
                ELSE 0
                END
    FROM myTable
    WHERE Col1 = @Col1

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    EXISTS est fait pour cela. Mais quel est votre but ?

    Si c'est de faire un test préalable pour une mise à jour, alors c'est stupide.

    A +

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous pouvez faire ainsi en SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*) as tst
     where exists (select null
                     FROM myTable
                    WHERE Col1 = @Col1)

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Pourquoi un COUNT(*) ???? Si il n'y a rien => pas de ligne. Le COUNT coute !

    A +

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Ça me paraît pas mal pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    select COUNT(*) as tst1
     where exists (select null
                    where 1 = 1);
     
    tst1
    -----------
    1
     
    select COUNT(*) as tst2
     where exists (select null
                    where 1 = 0);
     
    tst2
    -----------
    0
    Ça marche aussi avec un CASE, mais c'est plus long à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select case
             when exists (select null
                           where 1 = 1)
             then 1
             else 0
           end as tst1;
     
    select case
             when exists (select null
                           where 1 = 0)
             then 1
             else 0
           end as tst2;

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    dehorter olivier:

    Humm, il va s'arreter au premier record qu'il trouve?

    SQLpro:
    Je dois réécrire des écrans VB6 en Net.
    L'écran sur la validation fait des inserts/update dans plusieurs tables
    Dans ces tables certains champs doivent être unique (exemple: NumeroNational), d'autres ne doivent pas encore exister(exemple attribuer un livre qui n'aurait pas encore été rendu)
    L'écran fait une partie des validations pour rendre des messages plus clair sur les problèmes.
    Vu que je suis pour l'instant obliger de reprendre le meme mode de fonctionnement (on utilise des objets com écrit en .Net dans le vb6)

    Finalement j'ai écrit ce code dans ma procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF EXISTS (SELECT 1 FROM myTable WHERE Col = @Col) SELECT CAST (1 As bit)
    ELSE SELECT CAST (0 As bit)

    J'aime bien aussi tes solution Waldar.

    Merci à vous

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    C'est bien ce que je craignais. Vous faites n'importe quoi !
    Entre le moment de cette requête de test et le moment de la seconde requête de mise à jour, quelqu’un peut lancer le même traitement et la double insertion peut conduire à un doublon.

    C'est pourquoi cette approche est stupide et vous devez simplement mettre des contraintes notamment d’unicité.

    Pour vos message client, il ne suffit plus que d'afficher le texte de l'erreur remonté par le serveur SQL.

    A +

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est bien ce que je craignais. Vous faites n'importe quoi !
    Et encore tu n'as rien vu, les foreign key ca n'existe pas ici

Discussions similaires

  1. Tester l'existence de record
    Par Hobbi1 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 14/10/2013, 10h50
  2. Réponses: 5
    Dernier message: 14/09/2010, 11h52
  3. Annuler ajout si record existe deja
    Par Junior_jef dans le forum VBA Access
    Réponses: 4
    Dernier message: 04/10/2007, 14h31
  4. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 14h10
  5. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 18h11

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