Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.119.17] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Всем привет.
Есть представление, например CREATE VIEW SM1 AS SELECT DISTINCT TOP(100000000) PaWo FROM mPa WHERE Length>7 AND Cat<>'EUc_1' and Typ='all' его я выгружаю в файлик exec PaWo..xp_cmdshell 'bcp "SELECT * FROM PaWo.dbo.SM1 " queryout e:\123.txt -c -C 1251 -r \n -T' с этим проблем нет - все работает. Но как сделать так, чтобы выгружалось не в 1 файл с 100000000 записей а в 1000 по 100000. То что делать нужно в цикле я понимаю , но вот личный уровень кунг-фу не позволяет это сделать. Буду рад любым подсказкам. PS: сейчас решаю задачу отдельным приложением, что очень долго и громоздко. |
Сообщ.
#2
,
|
|
|
Выгрузить всё в один файл, а потом внешним приложением (простейший VBS-скрипт) порубить его на нужное число кусков с нужным количеством строк на кусок будет гораздо быстрее.
Хотя бы потому, что для выгрузки в несколько файлов средствами (хранимая процедура) сервера потребуется в запрос добавить сортировку, причём ключ сортировки должен быть уникальным. |
Сообщ.
#3
,
|
|
|
Akina, 100000000 это очень скромная часть. База "весит" десятки гигов. Потому и не хочу привлекать сторонние "приблуды" чтобы все собиралось отрабатывалось и собиралось в одном месте с минимальным вмешательством человека..
|
Сообщ.
#4
,
|
|
|
Как вариант сделать временную таблицу, куда передать все данные выборки и по номеру по порядку выдергивать данные частями какими хочешь
|
Сообщ.
#5
,
|
|
|
Цитата ^D^ima @ как сделать "врукопашную" я понимаю, нужна автоматизация процесса. Возможно я не понял предложенного, тогда прошу развернуть идею |
Сообщ.
#6
,
|
|
|
Цитата Орт_ИКС @ нужна автоматизация процесса Ну так всё автоматизируется в рамках одного скрипта. Скажем, VBS. Сначала стартует клиент командной строки (bcp), которому скармливается запрос на выгрузку. Он выполняет запрос и копирует нужные записи в файл с заданным именем в заданном каталоге. По завершении работы клиента скрипт рубит этот файл на нужные куски. В принципе всё укладывается в десяток строк кода. Оператору достаточно запустить скрипт (а если надо - то можно это поручить планировщику, и тогда вмешательство человека будет не то что минимальным - вообще нулевым), дождаться окончания его работы, и дальше делать с требуемым пакетом файлов, что ему нужно. PS. И обратите серьёзное внимание на то, что сортировка, в которой все отбираемые записи уникальны - необходима. Без неё в выходной файл попадёт заданное число случайных записей из всех, которые отвечают требованиям (условиям отбора в запросе). Конечно, это не актуально и не требуется, если количество отбираемых записей заведомо меньше заданного количества, и TOP 1000000 туда засунут чисто "от фонаря". |
Сообщ.
#7
,
|
|
|
Цитата Akina @ Примерно так я и делаю. Создаю таблицу только уникальных записей, Маркирую из этой таблицы тор 100м записей ключом i. Отмаркированные записи выгружаю в файл. увеличиваю ключ, маркирую следующие 100м и так по циклу пока все записи не будут отмаркированы |
Сообщ.
#8
,
|
|
|
А смысл? всё равно в итоге выгружаются все записи. Тогда пофиг, есть сортировка или нет её, если порядок записей в кусках неважен.
В описанном мной варианте можно сразу выгружать все, сколько есть, сто тыщ мильёнов записей, без всех этих заморочек с маркированием. Всё одно на следующем этапе оно на куски порежется. Да, при этом нужен двойной объём дискового пространства, но с местом, как я понимаю, проблем нет. |