2013-05-11 2 views
5

Scénario: nous récupérons des lignes de SQL Server vers l'application de console C# .Net et effectuons une action sur les données récupérées à partir de SQL Server via la procédure stockée; après l'exécution de l'action, les nouvelles données sont stockées dans le MongoDB en utilisant C# -MongoDB-Driver.Quel est le meilleur moyen d'extraire les enregistrements par lots à partir de SQL Server

Problème: Il existe des milliards de lignes. Ma procédure stockée contient la requête comme suit:

select * from table_name 

Pour travailler à une certaine logique par lot il n'y a pas de colonne d'identité, ni aucune colonne de date ou tel.

Informations: A ce jour l'application est la récupération des dossiers jusqu'à 3500 - 5000 dossiers et le stockage dans MongoDB et il renvoie une erreur qui est la suivante:

System.Runtime.InteropServices.SEHException (0x80004005): Le composant externe a levé une exception.

Question: Quelqu'un peut-il me suggérer une certaine logique à travailler pour la lecture par lots/récupération de SQL Server?

Répondre

9

Si vous ne pouvez pas utiliser OFFSET-FETCH dans SQL Server 2012 et en supposant que la table a une clé primaire ou colonne (s) qui vous permettent d'identifier de façon unique une ligne, permet de l'appeler UniqueKey, puis en 2005, vous pouvez utiliser le haut ROW_NUMBER comme ça ...

SELECT UniqueKey, col2, col3 
FROM 
(
    SELECT UniqueKey, col2, col3, ROW_NUMBER() OVER (ORDER BY UniqueKey) AS RowNum 
    FROM YourTable 
) sub 
WHERE sub.RowNum BETWEEN @startRow AND @endRow 

Si vous avez vraiment aucune clé unique ou possibilité d'ajouter un, alors vous pouvez utiliser ...

ROW_NUMBER() OVER (ORDER BY (SELECT 0)) 

... pour essayer de préserver l'ordre naturel que les enregistrements sont stockés. Mais, selon votre structure de données, il n'est pas garanti de fonctionner exactement comme vous le souhaitez. Donc, tester la migration serait encore plus important, mais je suis sûr que vous le ferez de toute façon ;-)

7

Si vous utilisez MSSQL 2012, essayez la clause OFFSET-FETCH. C'est la meilleure solution!

examle: SELECT ... ORDER BY orderid OFFSET 25 FETCH PROCHAINES 25 RANGS RANGS SEULEMENT

It means this query will return from 25 to 50 records. 
ORDER BY clause is mandatory, so if dont want to use order, 
just write like: ....ORDER BY (SELECT NULL)..... 
+0

Les balises question suggèrent qu'ils utilisent SQL Server 2008 – davmos

+0

Oui meilleure solution que vous aviez proposé, à condition que nous soyons sur MS SQL 2012. Mais nous sommes sur MS SQL 2008 et 2008 R2 .. Merci pour votre temps .. –

Questions connexes