2013-05-11 2 views
5

Сценарий: мы извлекаем строки из SQL Server в C# .Net консольное приложение и делаем действия по извлеченным данным из SQL Server с помощью хранимой процедуры; после выполнения действия новые данные сохраняются в MongoDB с использованием C# -MongoDB-Driver.Каков наилучший способ выборочной записи записей из SQL Server

Вопрос: Есть миллиарды рядов. Моя хранимая процедура содержит запрос следующим образом:

select * from table_name 

Выработать некоторые порционно логики нет никакого столбца идентификации, ни какой-либо даты или столбцы, например.

Информация: В настоящее время приложение выборки записи Шифрование до 3500 - 5000 записей и хранение в MongoDB, а затем он выдает ошибку, которая выглядит следующим образом:

System.Runtime.InteropServices.SEHException (0x80004005): Внешний компонент выбрал исключение.

Вопрос: Может ли кто-нибудь предложить мне некоторую логику, чтобы работать для пакетных мудрых чтений/выборок из SQL Server?

ответ

9

Если вы не можете использовать OFFSET-FETCH в SQL Server 2012 и предполагая, что таблица имеет первичный ключ или столбец (ы), которые позволяют однозначно идентифицировать строку, позволяет называть его UniqueKey, то в 2005 году вверх можно использовать ROW_NUMBER как это ...

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 

Если вы действительно не имеют уникального ключа или возможность добавления одного, то вы могли бы использовать ...

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

... чтобы попытаться сохранить естественный порядок, что записи хранятся. Но, в зависимости от вашего структура данных, это не гарантирует, что вы будете работать именно так, как вы этого хотите. Итак, тестирование миграции будет еще более важным, но я уверен, что вы все равно это сделаете ;-)

7

Если вы используете MSSQL 2012, попробуйте предложение OFFSET-FETCH. Это лучшее решение!

нелогич-: SELECT ... ORDER BY OrderID OFFSET 25 РЯДЫ FETCH NEXT, 25 ROWS ТОЛЬКО

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

Теги вопроса предполагают, что они используют SQL Server 2008 – davmos

+0

Да, лучшее решение, которое вы предложили, при условии, что мы на MS SQL 2012. Но мы на MS SQL 2008 и на 2008 R2 .. Спасибо за ваше время .. –

Смежные вопросы