【问题标题】:Import one csv file with data for multiple tables in MS SQL server导入一个 csv 文件,其中包含 MS SQL 服务器中多个表的数据
【发布时间】:2014-10-17 01:35:04
【问题描述】:

我有以下表格(为问题而简化):

数据:

Id
Serialnumber
Value
AddressId (ForeignKey)

地址:

Id
Street
ZipCode
City
...

现在我有一个包含数据的 csv 文件,不幸的是两个表:

Serialnumber,Value,Street,ZipCode,City, ...
12345,1140,Fakestreet 3,12345,New York
5678,830,Fakestreet 87,12345,New York

有没有办法将这样的 csv 文件导入 Microsoft SQL Server (2008)?服务器本身必须先插入地址,然后使用Addresses表的主键作为Data表的外键。

【问题讨论】:

  • 使用 sql server 导入向导将数据导入到 staging 表中的 sql server 中,然后编写 t-sql 查询以将数据插入到最终目标表中。

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

您需要将 CSV 文件导入如下的暂存表中,然后进行相应处理。

IF (OBJECT_ID('StagingData') IS NULL)
    CREATE TABLE StagingData
    (  
       SerialNumber int,
       Value int,
       Street varchar(256),
       ZipCode int,
       City varchar(256)

    )

TRUNCATE table StagingData

BULK
INSERT StagingData
FROM 'c:\csvtest.txt'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

【讨论】:

    【解决方案2】:
    1. 如果有空间,我肯定会将整个 CSV 导入到临时表中,然后使用 SQL 语句插入到目标表中。暂存表可以是#temp 表或在专门为暂存创建的单独数据库中。
    2. 如果没有,那么您可以设置一个包含所有字段的虚拟表,并将您的 INSERT 从 CSV 定义到虚拟表。然后使用INSTEAD 触发器插入实际目标表而不是虚拟表。请记住,触发器将在同一个批次中接收多个插入,因此它需要处理多个插入。因此,将 Address 主键捕获到 @table 变量中。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多