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 :

Évaluer une expression textuelle


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut Évaluer une expression textuelle
    Bonjour,

    Je cherche une façon d'évaluer si une expression dans un variable de type NVARCHAR est vraie ou fausse.

    Lorsque c'est une expression booléenne, le méthode suivante fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @expression NVARCHAR(100); SET @expression = '((1 | 0))';
    DECLARE @Result INT;
     
    IF OBJECT_ID('tempdb..#MyTableTemp') IS NOT NULL DROP TABLE #MyTableTemp
    CREATE TABLE #MyTableTemp (result INT)
    EXEC('INSERT INTO #MyTableTemp SELECT ' + @expression )
    SET @Result = (SELECT TOP 1 result FROM #MyTableTemp)
    DROP TABLE #MyTableTemp 
    PRINT @Result
    Resultat obtenu: 1

    Par contre, je souhaite évaluer une expression semblable à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @expression NVARCHAR(100); SET @expression = '((1 | 0) & (2 < 3))';
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @expression NVARCHAR(100); SET @expression = '((1 OR 0) AND (2 < 3))';
    Mais ça ne fonctionne pas. Quelqu'un a une suggestion ?

    Pascal

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    C'est le "<" qui pose problème
    essayez de convertir en "Case When Else"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut
    Donpi, merci pour la suggestion mais trop complexe.

    À la base, ce sont des conditions qui seront remplies par de gens qui n'ont aucune idée c'est quoi le langage SQL.

    À noté que les 1 et 0 remplacent des valeurs selon leur présence dans un 'array' de valeurs et ont été traités précédement.

  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,

    Dans ce cas remplacez automatiquement les "pipes" et les "et commerciaux" avant de procéder à l'insertion dans la table, soit dans l'application, soit par un trigger INSTEAD OF.

    Notez que l'utilisation du code T-SQL dynamique n'est ici d'aucune utilité.
    D'autre part comme vous n'utilisez pas la procédure stockée système sp_executesql pour ce faire, à chaque fois que la valeur de @expression change, un nouveau plan d'exécution est généré.
    Comme il y a très peu de chances pour que celui-ci soit réutilisé (il faudrait pour cela que les valeurs de @expression changent peu), vous aurez un cache de procédures un peu pourri.

    Ensuite, les tables dans TempDB, comme toute table, ont un schéma. Si vous ne le connaissez pas et qu'aucun schéma par défaut n'a été attribué à l'utilisateur qui exécute ces requêtes, c'est dbo. Le double point est imprécis, et c'est SQL Server qui fait la recherche pour vous.

    Enfin je ne vois pas l'intérêt de la table temporaire ici

    @++

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par Passepoil Voir le message
    Par contre, je souhaite évaluer une expression semblable à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @expression NVARCHAR(100); SET @expression = '((1 | 0) & (2 < 3))';
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @expression NVARCHAR(100); SET @expression = '((1 OR 0) AND (2 < 3))';
    Mais ça ne fonctionne pas. Quelqu'un a une suggestion ?

    Pascal
    1 | 0 est incorrect
    1 OR 0 est presque correct
    ((1 = 1 OR 0 = 1) AND (2 < 3)) serait correct

    Voici ce que je vous suggère de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @clause NVARCHAR(MAX) =
    N'
    ((1 = 1 OR 0 = 1) AND (2 < 3))
    '
    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
    DECLARE @b BIT
    DECLARE @query NVARCHAR(MAX) = REPLACE(
    N'
    SELECT @b = MAX(val)
    FROM (
    	SELECT
    		1
    	WHERE {clause}
     
    	UNION ALL
     
    	SELECT 0
    ) AS Src(Val)
    '
    , N'{clause}'
    , @clause
    )
     
     
    EXEC sp_executesql 
            @query = @query
            , @params = N'@b BIT OUTPUT'
            , @b = @b OUTPUT 
     
    -- SELECT @b
    Most Valued Pas mvp

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut
    Merci Sergejack,

    J'avais justement trouvé cette formulation hier soir.

    Merci de votre aide.


    Pascal

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

Discussions similaires

  1. [XL-2010] Transformer une expression textuelle de formule en formule active
    Par forrest55 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/10/2011, 08h58
  2. Évaluer une expression non connue à l'avance
    Par jpclabaux dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/09/2011, 00h44
  3. Évaluer une expression arithmétique
    Par frucot dans le forum Débuter
    Réponses: 8
    Dernier message: 09/05/2010, 23h04
  4. évaluer une expression mathématique
    Par aminems dans le forum C++
    Réponses: 4
    Dernier message: 27/05/2008, 00h41
  5. [C#] Comment évaluer une expression ?
    Par bart64 dans le forum C#
    Réponses: 3
    Dernier message: 11/01/2006, 15h46

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