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 :

Filtrage valeurs procédure stockées avec possibilité de valeurs NULL


Sujet :

Développement SQL Server

  1. #1
    Membre actif Avatar de maxeur
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    416
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 416
    Points : 267
    Points
    267
    Par défaut Filtrage valeurs procédure stockées avec possibilité de valeurs NULL
    Bonjour à tous,

    Je suis en train de mettre en place une procédure stockée que voici

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    CREATE PROCEDURE [dbo].[TROUVER SOCIETE2]
    	@SOCIETE varchar(100)=NULL,
    	@VILLE varchar(30)=NULL,
    	@CP varchar(10) = NULL,
    	@TEL varchar(30) =NULL,
    	@FAX varchar(30) = NULL, 
    	@GROUPEMENT varchar(100)=NULL,
    	@AGENT varchar(50) = NULL,
    	@ACTIVITE varchar(50) = NULL,
    	@PAYS varchar(50) = NULL,
    	@un bit = null,
    	@deux bit = null,
    	@trois bit = null,
    	@quatre bit = null,
    	@aucun bit = null,
    	@client bit = null,
    	@prospect bit = null
    AS
    SELECT
    	SOCIETES.[ID SOCIETE],
    	COALESCE(SOCIETES.PRIORITE, 0) as PRIORITE,
    	CASE [SOCIETES].[POSITION] WHEN 'Client' THEN 'C' ELSE '' END AS [POSITION],
    	SOCIETES.[CODE CLIENT],
    	SOCIETES.[CLASSEMENT],
    	SOCIETES.SOCIETE,
    	SOCIETES.CP,
    	SOCIETES.VILLE,
    	[AGENTS COMMERCIAUX].AGENT as AGENT
    FROM
    	SOCIETES
    	LEFT OUTER JOIN [AGENTS COMMERCIAUX] ON SOCIETES.AGENT = [AGENTS COMMERCIAUX].[ID AGENT]
    WHERE
    	SOCIETES.SOCIETE <> ''
    	AND (SOCIETES.SOCIETE LIKE '%' + @SOCIETE + '%' OR @SOCIETE IS NULL)
    	AND ( SOCIETES.VILLE LIKE '%' + @VILLE + '%' OR @VILLE IS NULL)
    	AND (SOCIETES.CP LIKE @CP + '%' OR @CP IS NULL)
    	AND (SOCIETES.TELEPHONE1 LIKE '%' + @TEL + '%' OR @TEL IS NULL)
    	AND (SOCIETES.FAX1 LIKE '%' + @FAX + '%' OR @FAX IS NULl)
    	AND (SOCIETES.GROUPEMENT = @GROUPEMENT OR @GROUPEMENT IS NULL)
    	AND ([SOCIETES].AGENT = @AGENT OR @AGENT IS NULL)
    	AND (SOCIETES.ACTIVITE = @ACTIVITE OR @ACTIVITE IS NULL)
    	AND (SOCIETES.PAYS = @PAYS OR @PAYS IS NULL)
    	AND (SOCIETES.PRIORITE <> CASE WHEN @un = 0 then 1 else 36 end )
    	AND (SOCIETES.PRIORITE <> CASE WHEN @deux = 0 then 2 else 36 end)
    	AND (SOCIETES.PRIORITE <> CASE WHEN @trois = 0 then 3 else 36 end)
    	AND (SOCIETES.PRIORITE <> CASE WHEN @quatre = 0 then 4 else 36 end)
    	AND (SOCIETES.PRIORITE <> CASE WHEN @aucun = 0 then NULL  else 36 end )
    ORDER BY SOCIETES.SOCIETE
    GO
    Sur cette procédure des filtres sont en place en fonction des variables.

    J'ai un souci avec les valeurs NULL.

    Je m'explique :

    Le champs priorité contient 5 valeurs différentes : 1, 2, 3, 4 ou NULL

    Dans un formulaire j'ai 5 checkbox spécifiant les valeurs que je souhaite afficher

    Ce que je n'arrive pas à faire c'est de faire en sorte que ma variable @aucun me permette d'afficher ou non les valeurs null

    Si quelqu'un avait une idée ce serait vraiement sympa

    Merci d'avance pour vos réponses

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 788
    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 788
    Points : 52 806
    Points
    52 806
    Billets dans le blog
    5
    Par défaut
    par exemple en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN SOCIETES.PRIORITE IS NULL THEN '' ELSE SOCIETES.PRIORITE END = CASE WHEN @aucun = 0 then ''  else 36 end
    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/ * * * * *

  3. #3
    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,

    Ce que je n'arrive pas à faire c'est de faire en sorte que ma variable @aucun me permette d'afficher ou non les valeurs null
    Et c'est là toute votre erreur : NULL n'est pas une valeur, c'est un marqueur qui signifie justement l'absence de valeur.
    C'est d'ailleurs ce qui fait que vous devez écrire IS NULL et non pas = NULL.

    Si NULL était une valeur, alors le test suivant devrait retourner OK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NULL = NULL
    	PRINT 'OK'
    ELSE
    	PRINT 'KO'
    Or il se trouve qu'elle affichera KO dans la console de SQL Server Management Studio
    Vous pouvez changer l'opérateur = par n'importe quel autre opérateur arithmétique, le résultat sera le même

    De fait, vous ne pouvez donc pas écrire votre requête avec ce requis, sinon vous allez tout simplement à l'erreur syntaxique.
    Notez au passage que votre requête est très loin d'être performante, malgré tous les index que vous pourrez ajouter, parce que les filtres de votre requête ne sont pas SARGables.

    Vous devriez penser à utiliser l'indexation de texte intégral qui, bien que plus complexe à mettre en place, vous donnera de bien meilleurs gains.

    Entre-temps, vous auriez pu générer votre requête SQL dynamiquement et la faire exécuter au moteur de base de données à l'aide de la procédure stockée système sp_executeSQL :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    ALTER PROCEDURE dbo.TROUVER_SOCIETE2
        @_SOCIETE varchar(100) = NULL
        , @_VILLE varchar(30) = NULL
        , @_CP varchar(10) = NULL
        , @_TEL varchar(30) = NULL
        , @_FAX varchar(30) = NULL
        , @_GROUPEMENT varchar(100) = NULL
        , @_AGENT varchar(50) = NULL
        , @_ACTIVITE varchar(50) = NULL
        , @_PAYS varchar(50) = NULL
        , @_un bit = NULL
        , @_deux bit = NULL
        , @_trois bit = NULL
        , @_quatre bit = NULL
        , @_aucun bit = NULL
        , @_client bit = NULL
        , @_prospect bit = NULL
    AS
    BEGIN
        SET NOCOUNT ON
     
        DECLARE @sql nvarchar(max)
            , @priorite nvarchar(9)
     
        SELECT        @sql = 
        'SELECT        S.[ID SOCIETE]
                , ISNULL(S.PRIORITE, 0) AS PRIORITE
                , CASE S.[POSITION] WHEN ''Client'' THEN ''C'' ELSE '' END AS [POSITION]
                , S.[CODE CLIENT],
                , S.[CLASSEMENT],
                , S.SOCIETE,
                , S.CP,
                , S.VILLE,
                , AC.AGENT AS AGENT
        FROM        dbo.SOCIETES AS S
        LEFT JOIN    dbo.[AGENTS COMMERCIAUX] AS AC ON S.AGENT = AC.[ID_AGENT]
        WHERE        1 = 1'
     
        IF @_SOCIETE IS NOT NULL
            SET @sql = @sql + N' AND S.SOCIETE LIKE ''%' + @_SOCIETE + '%'''
     
        IF @_VILLE IS NOT NULL
            SET @sql = @sql + N' AND S.VILLE LIKE ''%' + @_VILLE + '%'''
     
        IF @_CP IS NOT NULL
            SET @sql = @sql + N' AND S.CP LIKE ''%' + @_CP + '%'''
     
        IF @_TEL IS NOT NULL
            SET @sql = @sql + N' AND S.CP LIKE ''%' + @_TEL + '%'''
     
        IF @_FAX IS NOT NULL
            SET @sql = @sql + N' AND S.FAX1 LIKE ''%' + @_FAX + '%'''
     
        IF @_GROUPEMENT IS NOT NULL
            SET @sql = @sql + N' AND S.GROUPEMENT LIKE ''%' + @_GROUPEMENT + '%'''
     
        IF @_AGENT IS NOT NULL
            SET @sql = @sql + N' AND S.AGENT LIKE ''%' + @_AGENT + '%'''
     
        IF @_ACTIVITE IS NOT NULL
            SET @sql = @sql + N' AND S.ACTIVITE LIKE ''%' + @_ACTIVITE + '%'''
     
        IF @_PAYS IS NOT NULL
            SET @sql = @sql + N' AND S.PAYS LIKE ''%' + @_PAYS + '%'''
     
        -- Recherche de la priorité
        SELECT    @priorite = CASE
                        WHEN @_un = 0 THEN N' > 1 '
                        WHEN @_deux = 0 THEN N' <> 2 '
                        WHEN @_trois = 0 THEN N' <> 3 '
                        WHEN @_quatre = 0 THEN N' < 4 '
                        ELSE N' IS NULL '
                    END
     
        SET    @sql = @sql + ' AND S.PRIORITE' + @priorite + 'ORDER BY S.SOCIETE'
     
        --PRINT    @sql
        EXEC    sp_executeSQL @sql
    END

  4. #4
    Membre actif Avatar de maxeur
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    416
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 416
    Points : 267
    Points
    267
    Par défaut
    Un grand merci à vous pour vos réponses

    SQLpro :

    La solution fonctionne merci je commençais à être perdu

    elsuket :

    Citation:
    Ce que je n'arrive pas à faire c'est de faire en sorte que ma variable @aucun me permette d'afficher ou non les valeurs null
    Et c'est là toute votre erreur : NULL n'est pas une valeur, c'est un marqueur qui signifie justement l'absence de valeur.
    C'est d'ailleurs ce qui fait que vous devez écrire IS NULL et non pas = NULL.
    J'avais compris qu'il ne s'agissait pas de valeur mais plutôt d'un manque de valeur je m'excuse pour l'abus de langage, j'étais dans ma réflexion et j'ai oublié de bien m'exprimé.

    Pour la construction dynamique de la requête c'est vraiment très intéressant je ne connaissais pas du tout.

    Je vais me noter ça et reviendrai sur le sujet pour l'évolution de l'application. A l'heure actuelle je ne peux pas vraiment m'y mettre mais je le garde sous le coude.


    Encore merci à tous les deux

  5. #5
    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
    J'avais compris qu'il ne s'agissait pas de valeur mais plutôt d'un manque de valeur je m'excuse pour l'abus de langage, j'étais dans ma réflexion et j'ai oublié de bien m'exprimé.
    Pas de souci
    En fait, comme c'est une erreur récurrente, et par la façon dont votre code est écrit, je me suis dit que vous étiez parti sur la mauvaise piste

    Si jamais vous rencontrez un problème avec le code SQL dynamique, n'hésitez pas à reposter.
    Disons que cela constituerait pour vous une solution temporaire avant de penser à l'indexation de texte intégral

    @++

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

Discussions similaires

  1. Procédure stockée avec paramètre à valeurs multiples
    Par kardes27 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 18/09/2013, 19h26
  2. Réponses: 2
    Dernier message: 22/02/2013, 15h24
  3. procédure stockée avec plusieurs valeurs
    Par djowen dans le forum Développement
    Réponses: 4
    Dernier message: 23/09/2011, 11h02
  4. [MySQL] procédure stockée et retour de valeur
    Par Papy214 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/02/2010, 10h00
  5. [SQL2K5] Procédure stockée avec paramètre à valeurs multiple
    Par Jinroh77 dans le forum Développement
    Réponses: 1
    Dernier message: 16/05/2008, 17h31

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