Мой вопрос связан с , который я задал на 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.
Какие тогда мои варианты?
Я форсируюИдентификаторы должны быть всегда одинаковыми, тогда мне нужно SET IDENTITY_INSERT ON
, чтобы я мог принудительно ввести значения в таблицу, таким образом, у меня всегда будут одинаковые идентификаторы для каждой из моих строк, как и предполагалось здесь .
Как НАСТРОИТЬ ВСТАВКУ с внешними ключами?Я не могу получить никаких документов по этому вопросу.= (
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ
Я отредактировал, чтобы включить BULK INSERT
Инструкция SQL, которая, наконец, сделала это для меня!
Моя книга Excel была готова с информацией, которую мне нужно было вставить. Итак, я просто создал несколько дополнительных листов и начал писать формулы по порядку"импортировать" информационные данные на эти новые листы. У меня было по одному для каждого из моих лиц.
- Улицы;
- Адреса;
- Граждан.
Что касается двух других сущностей, то было нецелесообразно их массово вставлять, поскольку у меня было только два города и пять секторов (городские подразделения) для вставки. Как только города и сектора вставлены, яотметил их соответствующие идентификаторы и начал готовить мои наборы записей для массовой вставки. Кстати, использование возможностей 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 *