Как использовать BULK INSERT, когда строки зависят от значений внешних ключей? - PullRequest
9 голосов
/ 05 декабря 2011

Мой вопрос связан с , который я задал на ServerFault .

Исходя из этого, я рассмотрел вопрос об использовании BULK INSERT.Теперь я понимаю, что мне нужно подготовить файл для каждой сущности, которую я хочу сохранить в базе данных.Несмотря ни на что, я все еще задаюсь вопросом, позволит ли этот BULK INSERT избежать проблемы с памятью в моей системе, как описано в ссылочном вопросе о ServerFault.

Что касается таблицы Streets, это довольно просто!У меня есть только два города и пять секторов, о которых нужно заботиться как о внешних ключах.Но тогда как насчет адресов?Таблица адресов имеет следующую структуру:

AddressId int not null identity(1,1) primary key
StreetNumber int null
NumberSuffix_Value int not null DEFAULT 0
StreetId int null references Streets (StreetId)
CityId int not null references Cities (CityId)
SectorId int null references Sectors (SectorId)

Как я уже говорил о ServerFault, у меня есть около 35 000 адресов для вставки.Должен ли я запомнить все идентификаторы?= P

И теперь у меня есть граждане, которые могут указать, кто связан с адресами.

PersonId int not null indentity(1,1) primary key
Surname nvarchar not null
FirstName nvarchar not null
IsActive bit
AddressId int null references Addresses (AddressId)

Единственное, что я могу придумать, это заставить идентификаторы работать статически.значения, но затем я теряю любую гибкость, которую я имел с моим прежним подходом с INSERT..SELECT Stategy.

Какие тогда мои варианты?

  1. Я форсируюИдентификаторы должны быть всегда одинаковыми, тогда мне нужно SET IDENTITY_INSERT ON, чтобы я мог принудительно ввести значения в таблицу, таким образом, у меня всегда будут одинаковые идентификаторы для каждой из моих строк, как и предполагалось здесь .

  2. Как НАСТРОИТЬ ВСТАВКУ с внешними ключами?Я не могу получить никаких документов по этому вопросу.= (

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ

Я отредактировал, чтобы включить BULK INSERT Инструкция SQL, которая, наконец, сделала это для меня!

Моя книга Excel была готова с информацией, которую мне нужно было вставить. Итак, я просто создал несколько дополнительных листов и начал писать формулы по порядку"импортировать" информационные данные на эти новые листы. У меня было по одному для каждого из моих лиц.

  1. Улицы;
  2. Адреса;
  3. Граждан.

Что касается двух других сущностей, то было нецелесообразно их массово вставлять, поскольку у меня было только два города и пять секторов (городские подразделения) для вставки. Как только города и сектора вставлены, яотметил их соответствующие идентификаторы и начал готовить мои наборы записей для массовой вставки. Кстати, использование возможностей Excel для вычисления значений и «импорта» внешних ключей само по себе было прелестью. После этого я сохранил каждый израбочие листы в отдельныйCSV файлМои записи были тогда готовы к заполнению.

USE [DatabaseName]
GO

delete from Citizens
delete from Addresses
delete from Streets

BULK INSERT Streets
    FROM N'C:\SomeFolder\SomeSubfolder\Streets.csv'
    WITH (
        FIRSTROW = 2
        , KEEPIDENTITY
        , FIELDTERMINATOR = N','
        , ROWTERMINATOR = N'\n'
        , CODEPAGE = N'ACP'
    )
GO
  • FIRSTROW

    Указывает номер строки, с которой начинается вставка.В моей ситуации мои CSV содержали заголовки столбцов, так что для начала была вторая строка.Кроме того, возможно, можно захотеть начать где-нибудь в своем файле, скажем, 15-ю строку.

  • KEEPIDENTITY

    Позволяет массово вставлять указанные идентификаторы сущности в файледаже если в таблице есть столбец идентификаторов.Этот параметр совпадает с SET INDENTITY_INSERT my_table ON перед вставкой строки, если вы хотите вставить с точным идентификатором.

Что касается других параметров, они говорят сами по себе.

Теперь, когда это объяснено, один и тот же код был повторен для каждой из двух оставшихся сущностей для вставки адресов и граждан.И поскольку было указано KEEPIDENTITY, все мои внешние ключи остались прежними, хотя мои первичные ключи были установлены в качестве идентификаторов в SQL Server.

Только несколько настроек, только то же самое, что и marc_sсказал в своем ответе, просто импортируйте свои данные как можно быстрее в промежуточную таблицу без каких-либо ограничений.Таким образом, вы сделаете свою жизнь намного проще, тем не менее, следуя хорошей практике.=) * 1 083 *

1 Ответ

16 голосов
/ 05 декабря 2011

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

Когда у вас есть данные в промежуточной таблице, , затем вам нужно начать беспокоиться об ограничениях и т. Д. При вставке данных из промежуточной таблицы в реальные таблицы.

Здесь вы можете, например,

  • вставить в таблицы реальной работы только те строки, которые соответствуют всем критериям (и пометить их как «успешно вставленные» в промежуточную таблицу)

  • обрабатывает все строки, оставленные в промежуточной таблице, которые не были успешно вставлены каким-либо процессом ошибки / восстановления - что бы это ни было: печать отчета со всеми «проблемными» строками, бросаниеих в «корзину ошибок» или что-то еще - полностью на ваше усмотрение.

Ключевой момент: фактический BULK INSERT должен быть в абсолютно неограниченной таблице - просто загрузите данные так быстрокак вы можете - и только тогда на втором шаге начинайте беспокоиться об ограничениях и поиске данных, ссылок и тому подобного

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