SQL Bulkcopy для отношений клиент / родитель - PullRequest
1 голос
/ 02 декабря 2009

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

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

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

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

Спасибо Daniel

Ответы [ 2 ]

0 голосов
/ 02 декабря 2009

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

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

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

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

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

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

...