BULK INSERT到外键表

时间:2011-04-13 14:35:20

标签: sql-server-2005

我有一个表Customer,其中包含客户的详细信息。以下是字段

CustId (PrimaryKey), Name, Date of Birth

我有另一张表,即资产信息。有以下字段 -

AssetId (PrimaryKey), AssetValue, CustId (Foreign Key Reference) 

我的CSV文件就是这样

Name, Date of Birth, AssetValue 

我必须将它插入两个表中。我拆分了CSV文件,其中一个文件名为出生日期,另一个文件只有AssetValue。

这是我做的 -

/*Creation of Table*/
CREATE TABLE Customer
(
    custid int identity(1,1) not null, 
    name nvarchar(50) not null, 
    dateofbirth datetime not null, 
    primary key (custid) 
)
CREATE TABLE Asset
(
    AssetId int identity(1,1) not null, 
    AssetDollars money not null, 
    primary key (AssetId),
    CustId int foreign key references Customer(custid)
)

对于批量插入,我所做的就是这个。我为Customer创建了一个视图,其中包含两个字段Name和Date of Birth,然后插入记录。

这是我做的 -

CREATE view vw_bulk_insert_customer
AS
    SELECT name, dateofbirth FROM customer

BULK  INSERT vw_bulk_insert_customer
FROM 'C:\Customer.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

这很好用。

现在,如何使用CustId将其插入Asset表(因为它在CSV文件中不可用)。

我不允许更改CSV文件。我可以拆分CSV文件,这是允许的。

我不知道该怎么做......有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以使用禁用novalidate over foreign key。一旦导入了所有数据,就可以启用对外键的无效。同样可以使用主键。使用novalidate选项的好处是您之前的数据不会根据该约束的规则进行检查,但会检查之后的数据。如果你想我可以粘贴整个语法来做同样的

答案 1 :(得分:0)

一种选择是将数据按原样导入到临时表中,然后将数据从该表复制到最终表中。这实质上是规范化数据库的后一部分(跳过规范化表的设计和定义)。

driver.close()
driver.quit()