基于此,我考虑使用BULK INSERT
.我现在明白,我必须为每个要保存到数据库中的实体准备一个文件.无论如何,我仍然想知道这个BULK INSERT是否会避免我的系统上的内存问题,如ServerFault上引用的问题所述.
至于Streets表,它非常简单!我只有两个城市和五个部门需要关心作为外键.但那么,地址怎么样? Addresses表的结构如下:
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个地址要插入.我要记住所有的ID吗? = 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)
我唯一能想到的就是强制ID为静态值,但是,我失去了以前使用INSERT..SELECT状态的方法所带来的灵活性.
那么我的选择是什么?
>我强制ID始终相同,然后我必须设置IDENTITY_INSERT,以便我可以强制将值放入表中,这样我的每个行总是有相同的ID,就像建议的here一样.
>如何使用外键进行BULK INSERT?我无法在任何地方获得任何文档. =(
谢谢你的帮助!
EDIT
I edited in order to include the
BULK INSERT
sql instruction that finally made it for me!
我准备好了我需要插入的信息的Excel工作簿.因此,我只是创建了一些补充工作表并开始编写公式,以便将信息数据“导入”到这些新工作表中.我的每个实体都有一个.
>街道;
>地址;
>公民.
至于其他两个实体,不值得批量插入它们,因为我只有两个城市和五个扇区(城市细分)要插入.插入城市和部门后,我注意到他们各自的ID,并开始准备我的批量插入记录集.顺便说一句,利用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
Indicates the row number at which to begin the insert. In my situation,my CSVs contained the column headers,so the second row was the one to begin with. Aside,one could possibly want to start anywhere in his file,let’s say the 15th row.
KEEPIDENTITY
Allows one to bulk-insert specified in-file entity IDs even though the table has an identity column. This parameter is the same as
SET INDENTITY_INSERT my_table ON
before a row insert when you wish to insert with a precise id.
至于其他参数,他们自己说.
现在解释了这一点,为剩下的两个实体中的每一个重复相同的代码以插入地址和公民.并且由于指定了KEEPIDENTITY,我的所有外键仍保持不变,尽管我的主键在sql Server中设置为标识.
虽然只有一些调整,就像marc_s在他的回答中所说的那样,只需尽可能快地将数据导入到一个没有任何限制的临时表中.通过这种方式,你可以让你的生活更轻松,同时遵循良好的做法. =)