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 :

[SQL2008] retourner la valeur d'un EXITS dans une procédure stockée


Sujet :

MS SQL Server

  1. #1
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut [SQL2008] retourner la valeur d'un EXITS dans une procédure stockée
    Bonjour à tous,

    Je dois faire une procédure stockée qui me retourne vrai ou faux
    Est-il possible de retourner la valeur d'un EXITS directement sans faire le bricolage suivant :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE PROCEDURE [dbo].[PS_EstAdmin]
    (
    	@Result bit output,
    	@USE_ID uniqueidentifier
    )
    AS
     
    BEGIN
    DECLARE @Err int
     
    	if (EXISTS (SELECT * FROM Role ))
    		begin 
    			set @Result=1
    		end
    	else
    		begin
    			set @Result=0
    		end
     
    	SET @Err = @@Error
    	RETURN @Err
     
    END
    Ceci est un exemple simple, il ne faut pas chercher à vouloir contourner le problème.
    Je recherche s'il exits une syntaxe qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Result= EXISTS (SELECT * FROM Role )
    J'ai esayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select @Result= EXISTS (SELECT * FROM Role )
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set @Result= EXISTS (SELECT * FROM Role )
    mais toujours le meme message : erreur proche de exits
    J'ai cherché sur Google, sur la MSDN, j'ai rien vu

    Please Help Me!!
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    je ne pense pas qu'on puisse récupérer la valeur d'un EXISTS, désolé.

    Généralement je fais un count(*) que je récupère dans une variable : si c'est positif c'est que ça existe

  3. #3
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mathusalem Voir le message
    je ne pense pas qu'on puisse récupérer la valeur d'un EXISTS, désolé.

    Généralement je fais un count(*) que je récupère dans une variable : si c'est positif c'est que ça existe
    Le problème du count c'est qu'il passe par toute les lignes, donc si t'en as 100000 ... alors que le EXITS ne s'embarasse pas en lisant tous.

    C'est pour cela que je recherche une solution avec EXITS.

    Mais bon, si c'est pas possible, quelqu'un peut me dire pourquoi?
    est-ce que EXITS retourne un type particulier ? ...

    Merki d'avance?
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Le problème du count c'est qu'il passe par toute les lignes, donc si t'en as 100000 ... alors que le EXITS ne s'embarasse pas en lisant tous.
    Le comportement n'est pas le même parce que ces deux commandes ne sont pas du même type, et c'est de cela que vient votre erreur :

    - COUNT est une fonction d'aggrégation
    - EXISTS est un prédicat, donc en aucun cas il ne retournera une valeur

    Si vous souhaitez récupérer une valeur par un SELECT, faites cela avec une fonction.
    En reprenant votre code, on obtient :

    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
    CREATE FUNCTION [dbo].[FN_EstAdmin] (@USE_ID UNIQUEIDENTIFIER)
    	RETURNS BIT
    AS
    BEGIN
    	DECLARE @Result BIT SET @Result = 0
     
    	IF EXISTS
    	(
    		SELECT *
    		FROM dbo.Role
    		WHERE USE_ID = @USE_ID
    	)
    	SET @Result = 1
    	RETURN @Result
    END
    Et en utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @estAdmin BIT
    SELECT @estAdmin = dbo.FN_EstAdmin(@USE_ID)
    @++

  5. #5
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Ok merci pour ta réponse clair

    Reste un truc que je ne comprend pas trop
    Comment se fait-il que EXIST ne retourne pas de valeur alors qu'on l'utilise pour faire in IF. C'est qu'il doit retourner 0/1 ou true/false.

    Est-ce un problème de retour de valeur "par valeur" au lieu de "par référence"?
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Est-ce un problème de retour de valeur "par valeur" au lieu de "par référence"?
    Aucune idée, je ne sais pas comment est faite l'implémentation de EXISTS

    @++

  7. #7
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Bon c'est pas grave.

    Merci quand même de tes informations.
    Au moins je ne continuerais pas de chercher pour rien

    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Réponses: 1
    Dernier message: 16/03/2007, 11h46
  3. Récupérer la valeur d'une ligne dans une procédure stockée
    Par mobscene dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 07/12/2006, 19h29
  4. Marquer une pause dans une procédure stockée
    Par PéPénet dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/11/2003, 10h42
  5. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31

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