Как заставить массовую вставку работать с несколькими таблицами - PullRequest
3 голосов
/ 18 октября 2011

Как с помощью массовой вставки SQL-сервера можно вставлять в несколько таблиц, когда существует связь с внешним ключом?

Я имею в виду, что таблицы такие,

CREATE TABLE [dbo].[UndergroundFacilityShape]
([FacilityID] [int] IDENTITY(1,1) NOT NULL,
[FacilityTypeID] [int] NOT NULL,
[FacilitySpatialData] [geometry] NOT NULL)

CREATE TABLE [dbo].[UndergroundFacilityDetail]
([FacilityDetailID] [int] IDENTITY(1,1) NOT NULL,
[FacilityID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Value] [nvarchar](255) NOT NULL)

Таким образом, каждаяUndergroundFacilityShape может иметь несколько UndergroundFacilityDetail.Проблема в том, что FacilityID не определен до тех пор, пока не будет выполнена вставка, поскольку это столбец идентификаторов.Если я массово вставляю данные в таблицу Shape, то не могу сопоставить их с данными, которые есть в моем приложении C #.

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

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

В будущем я ожидаю импортировать данные, которые намного больше, чем «тысячи» записей.

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

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

Я уже некоторое время использую этот инструмент для оперативных данных, и он работает нормально.

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

Так что, если инструмент используют более одного человека одновременно?Ну, да, я ожидаю проблем, но это никогда не случится для нас.

0 голосов
/ 27 октября 2011

Питер, вы упомянули, что у вас уже есть решение с прямыми INSERT s.

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

Если таблица назначения имеет кластеризованный индекс и не является пустой, вы также можете включить флаг трассировки 610 в дополнение кTABLOCK подсказка для запроса о том, чтобы сделать транзакцию минимально зарегистрированной.

Проверьте раздел «Использование INSERT INTO…SELECT для массового импорта данных с минимальной регистрацией» на странице INSERT MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...