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不匹配或指定代码页的字符无效)。
不要直接插入到真正的表格中。
我会永远
- 从CSV文件插入暂存表
dbo.Employee_Staging
(不带IDENTITY
列) - 可能编辑/清理/操纵您导入的数据
-
然后用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做这样的事情:
- 如果临时表存在,则删除
- 创build临时表
- 批量导入临时表
- 改变临时表添加标识
- <你想要用数据做什么>
- 删除临时表
还不是很干净,但这是另一种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忽略 。
继续完成,就是这样。 您的数据将被顺利导入。