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 :

2 résultats différents même requête


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut 2 résultats différents même requête
    Bonjour,

    Je viens vers vous car je me retrouve confronté à un soucis assez étrange.

    J'ai mis en place cette requête :

    Code sql : 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
     
                ;WITH Art AS (
                SELECT TOP 100 PS.Famille, PS.Référence
                     , PS.[Px Achat HT net] AS Prix_Achat
                     , PS.[Px Achat HT net] AS Somme_Cumulee
                     , ROW_NUMBER() OVER ( PARTITION BY LEFT( Famille, 1 ) ORDER BY PS.[Px Achat HT net] DESC ) Classement
                  FROM dbo.Produits_Stocks PS
                 WHERE LEFT( PS.Famille, 1 ) IN ( SELECT DISTINCT LEFT( Code, 1 )
                                                    FROM Inside_Replication.dbo.Lib_Famille
                                                   WHERE Lib_Sous_Rayon = @P_Type_Gage )
                   AND PS.Fournisseur IN ( SELECT Gageur
                                             FROM Inside_Gages.dbo.Banque_Gageurs
                                            WHERE Banque = @P_Banque )
                   AND PS.[Px Achat HT net] > 70000.00
                   AND LEFT( PS.Magasin, 3 ) = @P_Magasin
                   AND NOT EXISTS ( SELECT NULL
                                      FROM dbo.Produits_Gages PG
                                     WHERE PG.Reference_Gage = PS.Référence ) )
                ,Calcul_Gages AS (
                  SELECT *
                       , CASE WHEN Somme_Cumulee < @P_Tranche_1 THEN 1 ELSE 1 END Gage
                    FROM Art
                   WHERE Classement = 1
                  UNION ALL
                  SELECT A.Famille
                       , A.Référence
                       , A.Somme_Cumulee AS Prix_Achat
                       , A.Prix_Achat + T.Somme_Cumulee
                       , A.Classement
                       , ( SELECT CASE WHEN T.Somme_Cumulee < @P_Tranche_1 AND T.Gage = 1
                                       THEN 1 ELSE 0 END ) Gage
                    FROM Art A
                         INNER JOIN Calcul_Gages T ON A.Classement = T.Classement + 1 )
     
    		    INSERT INTO Inside_Gages.dbo.Produits_Gages
                       ( ID_Gage, Banque, Reference_Gage )
    	        SELECT @P_Id_Gage, @P_Banque, Référence
    	          FROM Calcul_Gages
    	         WHERE Gage = 1;

    Et je me retrouve avec un comportement étrange, lorsque j'enlève le INSERT j'ai, pour un de mes cas 2lignes sélectionnées et lorsque j'insert en base, je n'ai plus qu'une ligne.
    Même code, mêmes données, juste un INSERT supprimé (ou commenté) et mon résultat deviens faux.

    J'ai tenté d'exécuter ma requête avec les mêmes paramètres que ceux envoyé dans la procédure, et elle fonctionne sans soucis.

    Je ne comprends pas pourquoi ma requête me donne 2 résultats différents entre un select et un insert

    Si l'un de vous a une explication, je suis preneur

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Avez vous le même problème si vous enlevez le TOP 100?

    J'Espère que l'utilisation du TOP est juste là pour vos test car vous ne spécifiez pas de ORDER BY... donc SQL SERVER fait ce qu'il veut! il vous renverra des lignes différentes en fonction du plan d’exécution choisi... qui peut très bien varier dans le cas de l'INSERT
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Avez vous le même problème si vous enlevez le TOP 100?

    J'Espère que l'utilisation du TOP est juste là pour vos test car vous ne spécifiez pas de ORDER BY... donc SQL SERVER fait ce qu'il veut! il vous renverra des lignes différentes en fonction du plan d’exécution choisi... qui peut très bien varier dans le cas de l'INSERT
    le top 100 n'est là que pour le test. De toute façon, ma requête ne ressort que 2 lignes, donc le order by n'est pas obligatoire

    le soucis, c'est que le select simple ressort bien mes 2 lignes, mais ajouter le insert n'insert que 1 seule des deux lignes du select.

    C'est ce que je ne comprends pas.

    J'ai réussi à contourner le problème en passant par une @table qui va contenir l'ensemble du jeu de données sans filtrer sur le booléen Gage. Je stock le tout et ensuite seulement je fais un insert depuis mon @table.

    Mais du coup je perds en performances et ça me dérange.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    N'avez vous pas simplement un trigger sur la table ou vous insérez?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Lyche Voir le message
    le top 100 n'est là que pour le test. De toute façon, ma requête ne ressort que 2 lignes, donc le order by n'est pas obligatoire
    Vos requête finale ne contient peut être que deux lignes... mais qu'en est-il de la sous requête en pseudo table "Art", car c'est de celle-là qu'il s'agit.

    La remarque d'Ibersek me semble tout à fait pertinente, avez-vous essayé d'enlever le top(100) ?

    Par ailleurs, je pense que votre requête pourrait être simplifiée : il me semble que vous pouvez vous passer de votre récursive, et je suis sûr que vous pouvez remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN Somme_Cumulee < @P_Tranche_1 THEN 1 ELSE 1 END Gage
    Par

  6. #6
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Vos requête finale ne contient peut être que deux lignes... mais qu'en est-il de la sous requête en pseudo table "Art", car c'est de celle-là qu'il s'agit.

    La remarque d'Ibersek me semble tout à fait pertinente, avez-vous essayé d'enlever le top(100) ?

    Par ailleurs, je pense que votre requête pourrait être simplifiée : il me semble que vous pouvez vous passer de votre récursive, et je suis sûr que vous pouvez remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN Somme_Cumulee < @P_Tranche_1 THEN 1 ELSE 1 END Gage
    Par
    Oui, je pense aussi que je peux la simplifier, mais j'avoue ne pas avoir trouvé d'autre moyen pour faire un calcul cumulé ligne à ligne.

    Le principe étant de ne prendre que les objets dont la somme cumulée de la plus grande à la plus petite sont inférieur à un montant défini. Le ROW_NUMBER fait office de tri et me permet d'éviter le ORDER BY. Le TOP 100 m'évite le souci de dépassement de récursion (limité à 100) à moins que je puisse supprimer cette limite de 100 récursion.

    Question performances, il y a moins de 10000 lignes dans ma table, le processus s'exécute 3 fois et se fait en moins de 10secondes, ce qui est amplement suffisant pour mon client, sachant qu'il n'y aura jamais plus vue qu'à chaque fois que le processus est utilisé, toutes les tables sont truncate et que les nouvelles données sont chargées.

    Pour le 1 AS Gage, c'est une erreur quand j'ai recopié mon code c'est 0 ou 1 en cas de dépassement de valeur sur la somme cumulée. Je pourrais m'en passer mais je voulais rajouter une étape de contrôle dans mon code pour m'y retrouver au moment ou je l'ai fait. je n'ai pas pensé à le supprimer par la suite.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Lyche Voir le message
    Le TOP 100 m'évite le souci de dépassement de récursion (limité à 100) à moins que je puisse supprimer cette limite de 100 récursion.
    oui, en ajoutant OPTION (MAXRECURSION 0) à la fin de votre requete

  8. #8
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    oui, en ajoutant OPTION (MAXRECURSION 0) à la fin de votre requete
    Alors ça, ça va me sauver la vie, j'avoue que j'avais jamais cherché auparavant. merci

    Citation Envoyé par iberserk Voir le message
    N'avez vous pas simplement un trigger sur la table ou vous insérez?
    Non, aucun trigger. Je pense que c'est un comportement lié à la CTE, j'ai eu quelques soucis de filtres sur des colonnes "calculés" qui ne retournaient pas les bonnes informations alors qu'après stockage dans une table, la même requête finale sortait les bonnes données.
    Je pense que je dois mal cerner certaines subtilités des CTE.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    De toute façon le TOP n'est pas un opérateur ensembliste. Par conséquent il est non consistant. Il peut donc donner des résultats différents sur une même requête avec les mêmes données (mais pas forcément la même organisation interne des lignes !).

    Le TOP ne devrait JAMAIS être utilisé en prod.

    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/ * * * * *

  10. #10
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    De toute façon le TOP n'est pas un opérateur ensembliste. Par conséquent il est non consistant. Il peut donc donner des résultats différents sur une même requête avec les mêmes données (mais pas forcément la même organisation interne des lignes !).

    Le TOP ne devrait JAMAIS être utilisé en prod.

    A +
    certes, mais, ça ne m'explique toujours pas pourquoi ma requête change de résultat en ajoutant un INSERT
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/05/2014, 10h05
  2. Réponses: 4
    Dernier message: 26/03/2014, 17h18
  3. Même requête, résultats différents
    Par zorino dans le forum SQL
    Réponses: 8
    Dernier message: 18/06/2008, 11h31
  4. [SQL2K]Une même requête des résultats différents
    Par jeeerome dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2006, 14h20
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05

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