Briser une requête SQL Server 2008 en lots
Je suis en train de préparer un certain nombre de données pour la suppression par une 3ème partie, et, malheureusement, ils ne peuvent traiter des données dans des lots de 2000 dossiers. J'ai 100k enregistrements et peut-être besoin de diviser et d'exporter ces données plusieurs fois, donc je voudrais automatiser le processus en quelque sorte.
Est-il raisonnable de moyen facile de le faire à l'aide de SQL Server 2008? Je ne suis pas l'exécution d'une requête complexe -- il n'est pas trop loin de la SELECT PKID FROM Sometable ORDER BY PKID
, et alors que je peux probablement le faire à l'aide d'un curseur, je voudrais savoir si il ya une meilleure façon.
OriginalL'auteur Mass Dot Net | 2011-01-18
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Malk
Je pense que vous pouvez prendre avantage de l'utilisation de la fonction ROW_NUMBER, puis à l'aide de ENTRE pour spécifier une plage de lignes que vous le souhaitez. Vous pouvez également utiliser PKID si tu savais, il n'y avait pas de lacunes ou ne se soucie pas des lacunes
par exemple
C'est souvent utilisé pour la pagination des résultats. 4GuysFromRolla avoir une bonne article sur elle
Serait row_number() deviennent progressivement plus lent le plus dans la gamme il obtient? Esp près de la fin de la 100k enregistrements
OriginalL'auteur Conrad Frix
Vous pourriez travailler sur les plages dans un tout @@ROWCOUNT boucle pour cible les lignes nécessaires. Il peut fonctionner mieux que ROW_NUMBER (), ce qui aurait pour garder la numérotation à partir du début.
Même si vous demandez top(2000), s'il y a seulement 514 dossiers (à gauche), puis le dernier enregistrement est le 514e. Une affectation dans un multirow sélectionnez fonctionne en affectant la valeur de la dernière ligne, donc @endid=pkid est affecté à l'id de la 514e ligne (dernier) si il n'y a pas de 2000 lignes.
ohh, je vois -- vous venez de dire que c'est la façon dont vous traiter les cas où le dernier lot ne contient pas exactement 2000 lignes, droite?
exactement. La "première" batch pourrait aussi être la "dernière" fournée.
OriginalL'auteur RichardTheKiwi
J'ai fini par utiliser une combinaison des approches fournis par cyberkiwi et Adam. Je n'ai pas besoin d'utiliser
ROW_NUMBER
seulement parce que j'ai utilisé unIDENTITY
colonne dans unetable
type de données à la place.Voici une version expurgée du code que j'ai utilisé -- il a travaillé comme un charme. Merci encore à tous pour toute l'aide!
OriginalL'auteur Mass Dot Net