Импорт данных SQL Server

Мы разрабатываем импорт данных из внешнего источника, такого как MAS200, в нашу производственную базу данных SQL Server 2005/2008. Источником будет транзакционная база данных, защищенная/изолированная. Нам нужно синхронизировать нашу базу данных с источником, поэтому ожидается периодическая синхронизация данных.

Нам предоставляется свобода запрашивать исходные данные любого типа — например, в виде файлов CSV, txt или даже иметь исходные данные в другой базе данных SQL, которая имеет аналогичную структуру. Нам нужно выбрать лучший способ импорта данных — он будет периодическим и может выполняться ежечасно или ежедневно.

Основываясь на своем опыте, я считаю, что наличие исходных данных в базе данных SQL может быть лучшим способом начать работу. Вот грубый дизайн того, что мы получили до сих пор -

  1. Периодически исходная БД будет заполняться извне (не с нашей стороны)
  2. Предварительная обработка: полировка данных исходной таблицы (например, обрезка, поиск) — общее форматирование и преобразование данных.
  3. Fetch: создайте КУРСОР для циклического просмотра записей. Мы планируем обновить существующие данные и вставить новые, поэтому нам потребуется как минимум два цикла CURSOR один за другим.
  4. Заполнить: в цикле КУРСОР записи будут обновляться/вставляться.
  5. Постобработка: еще раз последние штрихи и сопоставление поиска (например, замена кода на идентификатор)
  6. Проверка. Наконец, запустите проверку согласованности таблиц, чтобы убедиться в целостности импортируемых данных.

Подводя итог, мы собираемся разбить шаги в хранимых процедурах, а затем создать задание SQL, которое будет выполнять эти шаги один за другим. Я знаю, что есть много способов сделать это, SSIS, мастер импорта данных и т. д., но мы должны сделать его достаточно простым, легко переносимым, менее зависимым и гибким для будущих изменений.

ПРИМЕЧАНИЕ. Данные будут огромными — в последний раз, когда у нас была аналогичная настройка, для завершения всего процесса импорта данных потребовалось несколько минут, например, почти 20-25 минут, поэтому мы запланировали почасовой импорт данных.

Спасибо.


ОБНОВЛЕНИЕ №1: я понимаю, что лучше использовать команду MERGE. Но если я должен создать его для SQL Server 2005? Я считаю, что это работает с 2008 года. Я нашел ссылку -

http://sqlserver-tips.blogspot.com/2006/09/mimicking-merge-statement-in-sql.html

Какие еще идеи на 2005 год?


person Hemant Tank    schedule 16.11.2011    source источник
comment
Если ваши данные огромны, как вы говорите, то во что бы то ни стало - избегайте курсоров!   -  person marc_s    schedule 16.11.2011


Ответы (3)


Для пунктов 3 и 4: если вы используете SQL Server 2008, рассмотрите возможность использования команды MERGE, а не курсоров и циклов.

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

person Jimbo    schedule 16.11.2011
comment
Итак, каковы мои альтернативы CURSOR - я имею в виду, что мне нужно перебирать записи как для вставки, так и для обновления. Как я могу использовать массовую вставку в этом случае? Массовое обновление невозможно, поэтому мне приходится зацикливаться! - person Hemant Tank; 16.11.2011
comment
Вы можете повторять, что такое RBAR. КУРСОРЫ работают медленно и вызывают, как минимум, блокировку строки. Если вы хотите выполнить итерацию, выгрузите значения во временную таблицу с IDENTITY и выполните WHILE @count <= @max и увеличьте @count или выполните WHILE EXIST(select top 1 1 from @variableTable) и удалите из таблицы... или что-то в этом роде. - person SQLMason; 16.11.2011
comment
Герман, команда MERGE сделает за вас вставки и обновления. - person Jimbo; 16.11.2011
comment
Извините, я должен был добавить в свой комментарий: ЕСЛИ вы хотите повторить - person SQLMason; 16.11.2011

Рассматривали ли вы возможность использования служб интеграции SQL Server? Похоже, ваш проект идеально подходит для этого.

Недавно я работал над проектом, который извлекал данные из различных источников данных (как баз данных, так и файлов), собирал их и очищал, а затем помещал в реляционную базу данных SQL Server 2008. Все это было довольно просто в SSIS.

person Simon    schedule 16.11.2011

Как уже говорили другие, в этом процессе нет необходимости использовать курсор; Я также согласен с тем, что SSIS, вероятно, лучше подходит для этого, чем вы думаете (потому что он является переносимым и настраиваемым). Однако, если вы хотите сделать это в T-SQL, я бы посоветовал вам заменить шаг FETCH чем-то вроде:

  1. Извлеките данные из промежуточной таблицы, которые вы использовали для полировки данных.
  2. Если вы не можете использовать команду MERGE в SQL 2008, вы можете эмулировать то же самое с помощью JOIN:

    --обновляемые строки SELECT * FROM staging JOIN destination ON staging.ID = destination.ID

    --строки для вставки SELECT * FROM staging JOIN target ON staging.ID = destination.ID WHERE destination.ID IS NULL

Легко, без курсоров.

person Stuart Ainsworth    schedule 16.11.2011