2013-07-08 1 views
1

Je dois créer plusieurs feuilles Excel dans un document Excel pour alimenter un autre système existant. Ce système hérité dont le code ne peut pas être modifié n'accepte aucune feuille dont les données dépassent 10 Mo.Requête pour limiter les enregistrements renvoyés par la requête sql en fonction de la taille des données

Actuellement, j'ai un processus manuel qui obtient toutes les données avec une requête sql, que je jette ensuite dans un classeur temporaire, puis le diviser en plusieurs classeurs afin que chaque classeur ne dépasse pas 10 Mo. Je rassemble ensuite chacune des feuilles de ces classeurs dans un grand classeur comportant plusieurs feuilles.

Je veux maintenant simplifier ce processus multi-étapes en utilisant une seule requête qui peut obtenir tous les enregistrements des tables tant que la taille totale de tous les enregistrements retournés ne dépasse pas 10 Mo. Je veux également être en mesure de spécifier les 10 Mo suivants de données à renvoyer à l'aide de la requête sql. Créer un petit programme n'est pas une option ici. Le nombre de colonnes que je spécifie dans la requête peut changer. Je veux être en mesure de le faire en utilisant une requête SQL uniquement.

Est-ce que quelque chose comme ceci peut être fait en utilisant SQL Server 2008?

Répondre

1

Vous pouvez utiliser les tables temporaires et EXEC sp_spaceused 'tablename' pour obtenir une estimation du nombre de lignes pouvant être insérées dans votre espace de 10 Mo. Vous pouvez ensuite utiliser le ROW_NUMBER() pour configurer votre pagination.

Je serai curieux d'entendre s'il y a une meilleure façon de faire ce que vous êtes intéressé par

+0

hi. Merci pour la réponse. Je regarde essentiellement une requête qui peut inclure une clause where pour la taille des données .. par exemple. "select * from nomtable où DATASIZE <= (1024 * 10)" ... quelque chose comme ça. – user20358

+0

Je n'ai jamais entendu parler d'un moyen de le faire, je crois que vous êtes coincé à choisir un certain nombre de lignes. –

1

Je suggère que vous fixer le nombre d'enregistrements pour chaque classeur et utiliser row_number():.

select seqnum/100000 as WhichWorksheet, <columns you want> 
from (select s.*, row_number() over (order by (select NULL)) as seqnum 
     from (<your subquery here>) s 
    ) s 

(Ce que vous voulez imagine 100000 lignes sur chaque feuille de calcul.)

vous pouvez essayer de deviner la taille de chaque ligne dans SQL Server. Cependant, déterminer ce que vous entendez par 10 Mbytes est difficile - voulez-vous dire 10 Mbytes comme mesuré par Excel? Voulez-vous dire 10 Mo dans un fichier CSV? Voulez-vous dire 10 Mo dans le stockage de base de données? Ou, vous pouvez ignorer ces questions et choisir un nombre de lignes qui a fonctionné dans le passé et passer à d'autres choses.

+0

La taille de la ligne de devinettes pour chaque ligne ne fonctionne pas, car certaines colonnes d'une ligne peuvent contenir des données inférieures à celles des mêmes colonnes de la ligne suivante appartenant au même jeu d'enregistrements. certaines des colonnes sont des colonnes varchar où il pourrait y avoir deux mots ou peut-être deux paragraphes. En ce moment je regarde 10MB de données purement sortis de sql. Je peux modifier la requête plus tard pour que les données récupérées atteignent 10 Mo dans Excel. Ne pas regarder csv pour le moment. mais encore une fois c'est juste la même chose; quelques ajustements requis pour que les données du jeu d'enregistrements s'élèvent à 10 Mo dans un CSV. – user20358

+0

Dans le passé obtenir un nombre approximatif d'enregistrements n'a pas aidé parce que dans un jeu d'enregistrements où toutes les colonnes sont remplies au maximum, j'ai peut-être besoin d'environ 20 000 enregistrements pour faire 10 Mo. Dans un jeu d'enregistrements maigre de la même table avec le même nombre de champs que j'ai besoin entre 25000-30000 lignes pour faire 10 Mo. Il serait bien d'avoir une clause where pour la requête sql comme: "select * from nomtable où DATASIZE <= (1024 * 10)" – user20358

+0

@ user20358. . . La méthode "sp_spaceused" peut fonctionner. Je suggère que vous écrivez une procédure stockée qui parcourt les types et les colonnes et ajoute les valeurs plus comme une estimation de l'utilisation "Excel" plutôt que l'utilisation de "base de données". Microsoft a beaucoup de documentation sur l'espace occupé par les différents types de données. –

Questions connexes