Как использовать BULK INSERT, когда строки зависят от значений внешних ключей?

Мой вопрос связан с тем, что я задал на 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.

Какие у меня варианты?

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

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

Спасибо за вашу любезную помощь!

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

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

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

  1. Streets ;
  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 сказал в своем ответе, просто импортируйте свои данные как можно быстрее в промежуточную таблицу без каких-либо ограничений. Таким образом, вы значительно упростите себе жизнь, тем не менее следуя передовым практикам. =)

9
задан Community 23 May 2017 в 11:46
поделиться