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 :

Bug du SQL 2008 ?


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Bug du SQL 2008 ?
    Bonjour,

    Voici un petit exemple d'un problème que je rencontre.

    Selon moi, la deuxième requette ne devrait pas me renvoyer une erreur de conversion de type de données sachant que la condition n'est pas à TRUE.
    Elle devrait m'afficher la chaîne d'origine. Je me trompe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    declare
    @valstr varchar(10)
     
    select case when @valstr not like '%et%' then CONVERT(float,@valstr) else @valstr end
     
    set @valstr='30 et 50'
     
    select case when @valstr not like '%et%' then CONVERT(float,@valstr) else @valstr end

    D'ailleurs j'ai fait la vérification via cette dernière modifié ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select case when @valstr not like '%et%' then /*CONVERT(float,@valstr)*/ @valstr+'***'  else @valstr end
    Les étoiles ne sont pas affichées.

    Merci pour vos commentaires.

  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 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Impossible.. Parce que le LIKE est optimisé dans MS SQL Server...

    En effet, pour être efficace un SGBDR doit comprendre votre requête et estimer quelle est la meilleur façon d'opérer ce qui aboutit au final à trouver le meilleur plan de requête.
    Lors de la compilation, il a donc besoin de savoir ce que les valeurs des paramètres représente afin d'estimer dans ses statistiques s'il est préférable de commencer par telle ou telle branche du case...
    C'est pourquoi vous obtenez cette erreur qui n'a pas lieu lors de l'exécution, mais lors de l'établissement du plan de requête...

    Évidemment dans un mauvais SGBDR comme MySQL ceci passerait sans problème, mais au risque d'une erreur d'exécution, ce qui est pire, voir d'un plan pas du tout optimal (l'optimiseur de MySQL étant à l'optimisation ce que le BigMac est à la cuisine gastronomique !).

    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
    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 szych Voir le message
    Bonjour,

    Voici un petit exemple d'un problème que je rencontre.

    Selon moi, la deuxième requette ne devrait pas me renvoyer une erreur de conversion de type de données sachant que la condition n'est pas à TRUE.
    Elle devrait m'afficher la chaîne d'origine. Je me trompe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    declare
    @valstr varchar(10)
     
    select case when @valstr not like '%et%' then CONVERT(float,@valstr) else @valstr end
     
    set @valstr='30 et 50'
     
    select case when @valstr not like '%et%' then CONVERT(float,@valstr) else @valstr end

    D'ailleurs j'ai fait la vérification via cette dernière modifié ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select case when @valstr not like '%et%' then /*CONVERT(float,@valstr)*/ @valstr+'***'  else @valstr end
    Les étoiles ne sont pas affichées.

    Merci pour vos commentaires.
    Vous pouvez faire cela avec des conditions WHERE et UNION.
    C'est juste que dans le case, tout est évalué "en même temps".

    voici un exemple (sans indentation) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    declare @a varchar(10) = '9'
     
    select cast(CAST(@a as int) as nvarchar(10))
    where @a not like '%[a-z]%'
    union all
    select @a
    where @a like '%[a-z]%'
    Most Valued Pas mvp

Discussions similaires

  1. [MS SQL 2008]Connaitre la date de fin d'évaluation
    Par jowsuket dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/06/2008, 14h55
  2. Bug PL/SQL ? (forall, bulk collect into)
    Par wondersonic dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/02/2008, 12h05
  3. [SQL] bug recherche sql
    Par Doksuri dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/12/2007, 13h20
  4. Réponses: 1
    Dernier message: 30/10/2007, 18h47

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