Импорт данных SQL Server
Мы проектируем импорт данных из внешнего источника, такого как MAS200, в нашу производственную базу данных SQL Server 2005/2008. Источником будет транзакционная база данных, безопасная / изолированная. Нам нужно синхронизировать нашу базу данных с источником, чтобы обеспечить периодическую синхронизацию данных.
Нам предоставляется возможность запрашивать любой тип исходных данных - например, в форме CSV, текстовых файлов или даже иметь исходные данные в другой базе данных SQL, которая имеет аналогичную структуру. Нам нужно выбрать лучший способ импорта данных - он будет периодическим и может выполняться ежечасно или ежечасно.
Исходя из моего опыта, я считаю, что наличие исходных данных в базе данных SQL может быть лучшим способом для начала. Вот приблизительный дизайн того, что мы получили до сих пор -
- Периодически источник БД будет заполняться извне (не наша часть)
- Предварительная обработка: полировка данных исходной таблицы (т. Е. Обрезка, поиск) - общее форматирование и преобразование данных
- Fetch: Создать CURSOR для циклического просмотра записей. Мы планируем обновить существующие данные и вставить новые, поэтому нам нужно по крайней мере два цикла CURSOR один за другим.
- Заполнить: в цикле CURSOR записи будут обновляться / вставляться
- Постобработка: снова некоторые последние штрихи и отображение поиска (т. Е. Замена кода на id)
- Проверка: Наконец, запустите проверку согласованности таблиц, чтобы обеспечить целостность импортируемых данных
Подводя итог, мы собираемся разбить шаги в хранимых процедурах, а затем создать задание SQL, которое будет следовать этим шагам один за другим. Я знаю, что есть много способов сделать это, SSIS, Мастер импорта данных и т. Д., Но мы должны сделать его достаточно простым, легко переносимым, менее зависимым и гибким для будущих изменений.
ПРИМЕЧАНИЕ: данные будут огромными - в прошлый раз у нас была похожая настройка, для завершения всего процесса импорта данных потребовалось несколько минут, например, 20-25 минут, поэтому мы запланировали почасовой импорт данных.
Спасибо.
ОБНОВЛЕНИЕ № 1: Я понимаю, что использование команды MERGE кажется лучшим. Но если я должен создать его для SQL Server 2005? Я считаю, что это работает с 2008 года. Я нашел ссылку -
http://sqlserver-tips.blogspot.com/2006/09/mimicking-merge-statement-in-sql.html
Есть другие идеи на 2005 год?
3 ответа
Для пунктов 3 и 4 - если вы используете SQL Server 2008, рассмотрите возможность использования команды MERGE, а не курсоров и циклов
Если возможно, сохраните нетронутую копию исходной базы данных, а затем, если возникнут какие-либо проблемы с обработкой данных, вам будет легче отследить причину.
Рассматривали ли вы использование служб интеграции SQL Server? Похоже, ваш проект идеально подходит для этого.
Недавно я работал над проектом, который извлекал данные из различных источников данных (как баз данных, так и файлов), собирал их, очищал и затем помещал в реляционную базу данных SQL Server 2008. Это было довольно просто в SSIS.
Как уже говорили другие, нет необходимости использовать курсор в этом процессе; Я также согласен с тем, что SSIS, вероятно, лучше подходит для этого, чем вы думаете (потому что он переносимый и настраиваемый). Однако, если вы хотите сделать это в T-SQL, я бы посоветовал вам заменить шаг FETCH на что-то вроде:
- Извлеките данные из промежуточной таблицы, которую вы использовали для полировки своих данных.
Если вы не можете использовать команду MERGE в SQL 2008, вы можете эмулировать то же самое с помощью JOIN:
- Стрелки должны быть обновлены. SELECT * FROM staging JOIN
- Стрелки, которые нужно вставить. SELECT * FROM staging JOIN
Легко peasy, без курсоров.