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 :

Requête croisée dynamique trop longue (+8000) [2012]


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    BTS SIO
    Inscrit en
    Janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : BTS SIO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Requête croisée dynamique trop longue (+8000)
    Bonjour à tous,

    Je suis actuellement en stage dans une entreprise et je rencontre un problème, tout d'abord je souhaite préciser que je travaille sous SQL Server Management Studio 2012, j'ai à ma disposition une base de données plutôt volumineuse et je fois effectuer des tableaux de bords.

    Après m'être renseigner j'ai décidé d'opter pour une requête de ce format (exemple trouver sur une autre page du site dédié a l'information sur le PIVOT):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Produit, 
    	   SUM([2003]) AS [2003], 
    	   SUM([2004]) AS [2004], 
    	   SUM([2005]) AS [2005], 
    	   SUM([2006]) AS [2006] 
    FROM  Ventes
    PIVOT (SUM(Vente) FOR annee IN ([2003], [2004], [2005], [2006])) AS Annees
    GROUP BY Produit
    j'ai repris ce modèle de requête que j'ai rendu dynamique, ma requête est contenu dans une variable de type varchar(max), mais lorsque j'exécute ma requête elle semble bloquer, j'ai donc testé quelque truc pour cerner le problème et lorsque que j'affiche m'as requête je me rends compte que celle-ci est tronqué, de plus si j'affiche sa longueur cela me renvoi 7999, il me semble donc que ma requête bloque car elle ne peut contenir que 8000 caractère max, j'ai essayé d'alléger ma requête pour voir si elle fonctionner correctement pour cela j'ai retiré l'équivalent de 'AS [2005]' dans ma requête qui permet de renommer les colonnes, elle a donc fonctionné mais mes colonnes n'ayant pu de nom ce n'est pas très utile mais au moins je sais qu'elle fonctionne si je règle ce problème de longueur. Pour info j'estime que m'as requête doit faire entre 10.000 et 11.000 caractère.

    Je viens donc vers vous pour savoir si vous auriez une astuce à me proposer pour ce problème de longueur.

    PS : j'ai essayé d'utiliser le type text mais j'ai un message d'erreur disant que le type text est interdit en variable locale.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Ca ne changera sûrement pas votre problème mais votre GROUP BY extérieur et SUM sont inutiles :
    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
    with cte_ventes (produit, annee, montant) as
    (
    select 'A', 2004, 3 union all
    select 'A', 2005, 3 union all
    select 'A', 2004, 2 union all
    select 'B', 2002, 1
    )
    select produit
         , coalesce([2002], 0) as [2002]
         , coalesce([2003], 0) as [2003]
         , coalesce([2004], 0) as [2004]
         , coalesce([2005], 0) as [2005]
      from cte_ventes
     pivot (sum(montant) for annee in ([2002], [2003], [2004], [2005])) as t
     
    produit 2002 2003 2004 2005
    ------- ---- ---- ---- ----
    A          0    0    5    3
    B          1    0    0    0
    Quelle est votre version de SQL-Server ? Vous n'indiquez que la version de l'outil SSMS, pas la version du SGBD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @@version as 'sql server version'

  3. #3
    Candidat au Club
    Homme Profil pro
    BTS SIO
    Inscrit en
    Janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : BTS SIO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci, j'ai modifié ma requête mais elle est toujours trop longue.
    Version :

    Microsoft SQL Server 2012 - 11.0.5058.0 (Intel X86) May 14 2014 16:44:52 Copyright(c) Microsoft Corporation Enterprise Edition on Windows NT 6.3 <X64> (Build 16299:) (WOW64)

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    Quels sont les index disponibles sur la table ?

    Sont ils fragmentés ?

    A+

    Julien

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Avec la version 2012 de SQL-Server, une colonne typée varchar(max) peut aller jusqu'à 2 Go de données.
    Pour résoudre votre problème, il faut regarder par quelle méthode vous écrivez puis lisez votre code généré, ça peut être un problème de pilote qui tronque la longueur à 8000.

    Autre piste cette fois-ci pour contourner votre problème, y aurait-il une partie "fixe" de votre requête que vous pouvez déporter dans une vue, afin de raccourcir la requête finale ?

  6. #6
    Candidat au Club
    Homme Profil pro
    BTS SIO
    Inscrit en
    Janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : BTS SIO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Mon problème est résolu, je ne sais pas trop pourquoi mais dans ma requête j'utiliser 3 variables une pour récupéré toutes mes colonnes dans le select et une autre dans le pivot, et la dernière contient la requête finale les deux premières était a varchar(8000) et la dernière contenant la requête en varchar(max), j'ai passé les deux première en varchar(max) et cela fonctionne. Désolé pour la perte de temps occasionné...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/10/2008, 09h35
  2. pb requete trop longue
    Par Leimi dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/07/2006, 16h16
  3. requetes trop longues
    Par caro_tpl dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/07/2006, 14h27
  4. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 10h33
  5. Requete sql donnant un resultat croisé dynamique
    Par Brice Yao dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/07/2005, 10h38

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