2013-05-11 20 views
5

Scenario: stiamo recuperando le righe da SQL Server a C#. Applicazione console Net ed eseguendo un'azione sui dati recuperati da SQL Server tramite stored procedure; dopo che l'azione è stata eseguita, i nuovi dati vengono archiviati in MongoDB usando C# -MongoDB-Driver.Qual è il modo migliore per recuperare i record in batch da SQL Server

Numero: ci sono miliardi di righe. La mia stored procedure contiene interrogazione come segue:

select * from table_name 

di elaborare una certa logica in batch-saggio non v'è alcuna colonna di identità né colonne di data o tali.

Informazioni: A partire da ora l'applicazione è andare a prendere i record fino a 3500 - 5000 record e memorizzare in MongoDB e quindi genera un errore, che è la seguente:

System.Runtime.InteropServices.SEHException (0x80004005): il componente esterno ha generato un'eccezione.

Domanda: Qualcuno mi può suggerire una certa logica di lavorare per la lettura in batch-saggio/prendere da SQL Server?

risposta

9

Se non è possibile utilizzare OFFSET-FETCH in SQL Server 2012 e supponendo che il tavolo ha una chiave primaria o colonna (s) che permettono di identificare in modo univoco una riga, consente di chiamare UniqueKey, poi nel 2005 verso l'alto si potrebbe usare ROW_NUMBER come questo ...

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 

Se davvero avete chiave univoca o possibilità di aggiungere uno allora si potrebbe utilizzare ...

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

... per cercare di preservare l'ordine naturale che i record sono memorizzati in. Ma, a seconda della struttura dei dati, non è garantito che funzioni esattamente come si desidera. Quindi, testare la migrazione sarebbe ancora più importante, ma sono sicuro che lo farai comunque ;-)

7

Se si utilizza MSSQL 2012, provare la clausola OFFSET-FETCH. È la soluzione migliore!

examle: SELECT ... ORDER BY orderid OFFSET 25 righe FETCH PROSSIMI 25 righe SOLO

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

I tag delle domande suggerirebbero l'utilizzo di SQL Server 2008 – davmos

+0

Sì, la migliore soluzione che avevi proposto, a condizione che siamo su MS SQL 2012. Ma siamo su MS SQL 2008 e 2008 R2 .. Grazie per il tuo tempo .. –

Problemi correlati