BULK插入与身份(自动增量)列

我试图从CSV文件中添加数据库中的批量数据。

员工表具有自动递增的列ID (PK)。

 CREATE TABLE [dbo].[Employee]( [id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL, [Address] [varchar](50) NULL ) ON [PRIMARY] 

我正在使用这个查询:

 BULK INSERT Employee FROM 'path\tempFile.csv ' WITH (FIRSTROW = 2,KEEPIDENTITY,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n'); 

.CSV文件 –

 Name,Address name1,addr test 1 name2,addr test 2 

但是会导致这个错误信息:

第2行第1列(id)的批量加载数据转换错误(types不匹配或指定代码页的字符无效)。

不要直接插入到真正的表格中。

我会永远

  1. 从CSV文件插入暂存dbo.Employee_Staging (不带IDENTITY列)
  2. 可能编辑/清理/操纵您导入的数据
  3. 然后用T-SQL语句将数据复制到实际表中,如下所示:

     INSERT INTO dbo.Employee(Name, Address) SELECT Name, Address FROM dbo.Employee_Staging 

将一个ID列添加到csv文件并将其留空:

 id,Name,Address ,name1,addr test 1 ,name2,addr test 2 

从查询中删除KEEPIDENTITY关键字:

 BULK INSERT Employee FROM 'path\tempFile.csv ' WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n'); 

身份证字段将自动递增。

如果您将值赋给csv的id字段,除非您使用KEEPIDENTITY关键字,否则它们将被忽略,那么将使用它们来代替自动增量。

我有一个类似的问题,但我需要确保ID的顺序是alignment到源文件中的顺序。 我的解决scheme是使用VIEW作为批量插入:

保持你的表,并创build此视图(select除ID列之外的所有内容)

 CREATE VIEW [dbo].[VW_Employee] AS SELECT [Name], [Address] FROM [dbo].[Employee]; 

你的BULK INSERT应该看起来像:

 BULK INSERT [dbo].[VW_Employee] FROM 'path\tempFile.csv ' WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n'); 

您必须使用格式文件进行批量插入:

  BULK INSERT Employee FROM 'path\tempFile.csv ' WITH (FORMATFILE = 'path\tempFile.fmt'); 

格式文件(tempFile.fmt)如下所示:

11.0
2
1 SQLCHAR 0 50“\ t”2名称SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 50“\ r \ n”3地址SQL_Latin1_General_CP1_CI_AS

更多细节在这里 – http://msdn.microsoft.com/en-us/library/ms179250.aspx

我的解决scheme是添加ID字段作为表中的最后一个字段,因此批量插入忽略它,它会得到自动值。 清洁和简单…

例如,如果插入一个临时表:

 CREATE TABLE #TempTable (field1 varchar(max), field2 varchar(max), ... ROW_ID int IDENTITY(1,1) NOT NULL) 

请注意, ROW_ID字段必须始终指定为LAST字段!

另一种select是,如果您使用的是临时表而不是临时表,则可以在导入期望的情况下创build临时表,然后在导入之后添加标识列。

所以你的SQL做这样的事情:

  1. 如果临时表存在,则删除
  2. 创build临时表
  3. 批量导入临时表
  4. 改变临时表添加标识
  5. <你想要用数据做什么>
  6. 删除临时表

还不是很干净,但这是另一种select…可能必须locking安全。

我有这个完全相同的问题,使损失小时,所以我的灵感来分享我的发现和解决scheme,为我工作。

1.使用Excel文件

这是我采用的方法。 我使用了一个excel文件(.xlsx),内容如下所示,而不是使用csv文件。

 id username email token website johndoe johndoe@divostar.com divostar.com bobstone bobstone@divosays.com divosays.com 

请注意,id列没有值。

接下来,使用Microsoft SQL Server Management Studio连接到您的数据库,右键单击您的数据库,然后select导入数据(任务下的子菜单)。 selectMicrosoft Excel作为源。 当您到达名为“select源表和视图”的阶段时,请单击编辑映射 。 对于目标下的id列,点击它并select忽略 。 除非要保留​​ID,否则不要选中Enable Identity insert ,而是要从其他数据库导入数据,并且希望维护源数据库的自动增量标识。 继续完成,就是这样。 您的数据将被顺利导入。

2.使用CSV文件

在您的csv文件中,确保您的数据如下所示。

 id,username,email,token,website ,johndoe,johndoe@divostar.com,,divostar.com ,bobstone,bobstone@divosays.com,,divosays.com 

运行下面的查询:

 BULK INSERT Metrics FROM 'D:\Data Management\Data\CSV2\Production Data 2004 - 2016.csv ' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'); 

这种方法的问题是,CSV应该在数据库服务器或数据库可以访问的某个共享文件夹中,否则可能会出现“无法打开的文件”的错误,操作系统返回了错误代码21(设备还没有准备好)”。

如果要连接到远程数据库,则可以将CSV上传到该服务器上的目录,并以批量插入的方式引用该path。

3.使用CSV文件和Microsoft SQL Server Management Studio导入选项

像第一种方法一样启动导入数据。 对于源代码,请select平面文件来源并浏览您的CSV文件。 确保正确的菜单(一般,列,高级,预览)都可以。 确保在列菜单(列分隔符)下设置正确的分隔符。 就像在上面的excel方法中,点击编辑映射 。 对于目标下的id列,点击它并select忽略

继续完成,就是这样。 您的数据将被顺利导入。