Массовое копирование SQL для отношений клиент/родитель

у нас есть 2 DataTables в приложении .NET, имеющем отношение Client/Parent с миллионами строк. Эти данные должны быть вставлены в базу данных SQL Server через SQL BulkCopy. Возможно, несколько экземпляров этого приложения .NET работают параллельно, вставляя разные данные в одни и те же таблицы.

Для автоматической генерации первичных ключей у нас есть столбец идентификаторов в родительской таблице.

Проблема в том, что мы не знаем, как вставить соответствующие внешние ключи в дочернюю таблицу.

Кто-нибудь знает, как решить эту проблему отношений 1: N с помощью массового копирования? Мы не можем создать идентификаторы в .NET, поскольку может запускаться несколько экземпляров.

Спасибо, Даниэль.


person user115545    schedule 02.12.2009    source источник


Ответы (2)


Это лишь одна из многих причин, по которым я предпочитаю использовать естественные ключи, а не IDENTITY для всех моих первичных ключей.

Как узнать, какие дочерние элементы переходят к какому родителю в источнике данных? Если они связаны столбцом, то это не должно быть слишком сложно. Вставьте родительские строки, вставьте дочерние строки в промежуточную таблицу, затем вставьте дочерние строки, присоединившись к родительским в этом столбце, чтобы получить идентификатор.

Если взаимосвязь определяется просто относительными позициями в файле или чем-то подобным, то это становится более сложным. Вы можете либо включить строку файла #, а затем выполнить те же шаги, описанные выше, объединив их (child.line_num > parent.line_num и никакой другой parent.line_num не находится между этими двумя числами), или вы можете импортировать родителей по одному в цикл, захватите идентификатор, а затем вставьте все его дочерние элементы, используя этот идентификатор. Вы можете настроить это в SSIS без особых проблем, но это может быть медленно.

Имея более подробную информацию о вашей проблеме (источник данных и т. д.), я мог бы предоставить более подробную информацию.

person Tom H    schedule 02.12.2009

Не уверен, где ваши данные, но я бы подошел к этому так.

  1. Используйте промежуточные плоские файлы, один или несколько.
  2. Сведите данные и назначьте первичный ключ.
  3. Включить identity insert для родительской таблицы (означает пропустить автоинкремент)
  4. Используйте службы SSIS для загрузки базы данных, а не просто массовое копирование.
person Damir Sudarevic    schedule 02.12.2009