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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    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 Expert
    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
    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
    22 010
    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 : 22 010
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    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

  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
    22 010
    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 : 22 010
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    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

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    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)

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Pourquoi un COUNT(*) ???? Si il n'y a rien => pas de ligne. Le COUNT coute !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    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;

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