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

Administration SQL Server Discussion :

Incompréhension dans l'exécution d'une requête


Sujet :

Administration SQL Server

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut Incompréhension dans l'exécution d'une requête
    Bonjour à tous,

    Sur SQL Server 2017, je n'arrive pas à comprendre comment une requête est exécutée et surtout comment elle arrive à me faire une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(CONVERT(INTEGER, z.NoChrono)) FROM (select * from MaTable INNER JOIN @Temp ON IDtemp = IDMaTable) z;
    NoChrono est une colonne de MaTable, de type varchar(50) qui peut parfois contenir des valeurs alphanumériques, mais qui contient uniquement du numérique la plupart du temps.
    @Temp est une table temporaire qui est remplie suite à divers traitements, par certains ids de la table MaTable.

    La jointure des 2 tables ne doit retourner que des lignes de MaTable ou la colonne NoChrono ne peut contenir qu'un nombre, et c'est bien le cas qu'en je l'exécute seule, je l'ai vérifié.
    Cependant, quand j'exécute la requête complète, je me ramasse un message d'erreur
    Échec de la conversion de la valeur varchar 'AN0001' en type de données int
    comme si le convert se faisait sur la totalité de la table physique au lieu de n'être fait que sur le résultat de la jointure. AN0001 est bien une donnée "normale" de cette colonne mais qui est filtrée justement par la jointure pour ne pas être prise en compte.

    Je précise que ce code fonctionne sans problème dans les même conditions depuis bientôt 10 ans. Il pête tout d'un coup, là maintenant, sur la base client sans que j'arrive à comprendre pourquoi.

  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 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    C'est simple et classique... La volumétrie fait changer de plans, de stratégie, etc... pour une meilleure optimisation ! Si tu as du bottom UP le cas est classique. La conversion peut alors être effectué avant la jointure. C'est pour cela que les fonction TRY_CAST, TRY_CONVERT et TRY_PARSE ont été ajoutée !

    A +

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Je ne pense pas que ce soit du à la volumétrie, ça se produit sur de très petites bases, et jusque là ça ne se produisait pas même sur de très grosses bases (tout est relatif, on parle d'une 100ène de Go, 2 pour la plus grosse).

    Mais effectivement, j'ai appris fortuitement que lors d'une maj récente du logiciel aurait été diffusé, à l'ensemble des clients donc, des modifications sur la base pour "optimiser les plans d’exécutions" afin améliorer les performances de certains process chez certains, une petite poignée, de nos gros clients. Je ne sais pas en quoi consiste ces modifications, je ne sais rien voir de pertinent en faisant un DatabaseCompare.

    Je vais donc refiler la patate chaude au service concerné afin qu'ils me fournissent une requête corrigée et adaptée au nouveau fonctionnement ! Après tout, c'est eux qui sont reconnus expert SQL, c'est donc leur job !

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2017, 11h32
  2. Incompréhension dans le résultat d'une requète
    Par awalter1 dans le forum SQL
    Réponses: 7
    Dernier message: 02/02/2013, 18h55
  3. Erreur dans l'exécution d'une requête
    Par ouinih dans le forum SQL
    Réponses: 3
    Dernier message: 12/06/2008, 00h32
  4. Réponses: 3
    Dernier message: 15/06/2007, 23h50
  5. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 17h11

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