Question

Je cherche à tirer beaucoup de données à partir d'une base de données fox pro, travailler avec elle et l'insérer dans un base de données mysql. Il est trop à faire tous veulent à la fois de le faire en lots de 10 000 dossiers dire. Quel est l'équivalent à 5 LIMITER, 10 dans Fox Pro SQL, souhaite une instruction select comme

sélectionnez le nom, l'adresse de personnes maximum 5, 10;

soit seulement obtenir 10 résultats retour, à partir de la 5e. Ont regardé autour en ligne et ils ne font que mention supérieure qui est évidemment pas d'une grande utilité.

Était-ce utile?

La solution

FoxPro ne prend pas en charge directement une clause LIMIT. Elle a « TOP nn » mais qui ne fournit que les « top-la plupart des dossiers » dans un pourcentage donné, et même qui a une limitation de 32k enregistrements renvoyés (maximum).

Vous pourriez être mieux le dumping des données au format CSV, ou si ce n'est pas pratique (en raison de problèmes de taille), l'écriture d'un petit script FoxPro qui génère automatiquement une série de BEGIN-INSERT (X10000) déclarations -commit qui décharge à une série de fichiers texte. Bien sûr, vous auriez besoin d'un environnement de développement FoxPro pour cela, donc cela peut ne pas appliquer à votre situation ...

Autres conseils

Jetez un oeil à la RecNo () fonction.

Visual FoxPro ne prend pas en charge directement LIMIT. J'ai utilisé la requête suivante pour obtenir sur la limitation:     SELECT TOP 100 * from PEOPLE WHERE RECNO() > 1000 ORDER BY ID; où 100 est la limite et 1000 est le décalage.

Il est très facile de contourner la clause LIMIT en utilisant la clause TOP; si vous voulez extraire _start d'enregistrement pour enregistrer _finish à partir d'un fichier nommé _test, vous pouvez faire:

[VFP]

** en supposant _start <= _finish, sinon vous obtenez une erreur de la clause top

*

_finish = MIN (RECCOUNT ( '_ test'), _ fini)

*

SELECT * FROM (SELECT TOP (_finish - _start + 1) * FROM (SELECT TOP _finish *, RECNO () AS _tempo DE _test ORDER BY _tempo) xx ORDER BY _tempo DESC) yy ORDER BY _tempo

**

[/ VFP]

Je devais convertir une base de données Foxpro à Mysql il y a quelques années. Ce que je l'ai fait pour résoudre c'était ajouter une colonne id auto-incrémentée à la table Foxpro et l'utiliser comme la référence de la ligne.

Alors vous pourriez faire quelque chose comme.

select name, address from people where id >= 5 and id <= 10;

Le Foxpro documentation sql ne montrer quelque chose de similaire à limiter.

Ici, adapter cela à vos tables. Ça m'a pris comme 2 minutes, je fais waaaay trop souvent.

N1 - groupe par tous, et assurez-vous que vous avez obtenu un max (id), vous pouvez utiliser recno () pour faire un, correctement trié

N2 - N1 rejoint où l'ID = Max Id de N1, affichez le champ que vous voulez à partir de N2

Alors si vous voulez vous joindre à d'autres tables, mettez-les entre parenthèses et lui donner un alias et l'inclure dans une jointure.

Select N1.reference, N1.OrderNoteCount, N2.notes_desc LastNote
FROM
(select reference, count(reference) OrderNoteCount, Max(notes_key) MaxNoteId
from custnote 
where  reference != '' 
Group by reference
) N1
JOIN 
(
select reference, count(reference) OrderNoteCount, notes_key, notes_desc
from custnote 
where  reference != '' 
Group by reference, notes_key, notes_desc
) N2 ON N1.MaxNoteId = N2.notes_key

Pour développer la réponse de Eyvind je voudrais créer un programme utilise la fonction RecNo () pour tirer des documents dans une plage donnée, disons 10.000 enregistrements.

Vous pouvez ensuite le cycle par programmation de la grande table pour visseuse de 10.000 dossiers à la fois et préforme votre charge de données dans la base de données MySQL vous.

En utilisant la fonction RECNO () vous pouvez être certain de ne pas insérer des lignes plus d'une fois, et être en mesure de redémarrer à un point de savoir dans le processus de chargement de données. Ce qu'elle est soi-même peut être très pratique dans le cas où vous devez arrêter et redémarrer le processus de charge.

En fonction du nombre des lignes retournées et si vous utilisez .NET Framework, vous pouvez compenser / limiter la sur la manière suivante DataTable obtenu:

dataTable = dataTable.AsEnumerable().Skip(offset).Take(limit).CopyToDataTable();

Rappelez-vous d'ajouter les System.Data.DataSetExtensions Assemblée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top