Мой вопрос связан с тем, что я задал на ServerFault .
Исходя из этого, я рассмотрел возможность использования BULK INSERT
. Теперь я понимаю, что мне нужно подготовить файл для каждой сущности, которую я хочу сохранить в базе данных. Несмотря ни на что, мне все еще интересно, поможет ли эта BULK INSERT проблема с памятью в моей системе, как описано в упомянутом вопросе на ServerFault.
Что касается таблицы улиц, то она довольно проста! Мне нужно заботиться только о двух городах и пяти секторах как о внешних ключах. Но тогда как насчет Адресов? Таблица адресов структурирована следующим образом:
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
сказал в своем ответе, просто импортируйте свои данные как можно быстрее в промежуточную таблицу без каких-либо ограничений. Таким образом, вы значительно упростите себе жизнь, тем не менее следуя передовым практикам. =)