Abh*_*bhi 68 sql-server bulkinsert identity-column
我正在尝试从CSV文件中添加数据库中的批量数据.
Employee表有一个列ID
(PK)自动递增.
CREATE TABLE [dbo].[Employee](
[id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[Address] [varchar](50) NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我正在使用此查询:
BULK INSERT Employee FROM 'path\tempFile.csv '
WITH (FIRSTROW = 2,KEEPIDENTITY,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
Run Code Online (Sandbox Code Playgroud)
.CSV文件 -
Name,Address
name1,addr test 1
name2,addr test 2
Run Code Online (Sandbox Code Playgroud)
但它会导致此错误消息:
第2行第1列(id)的批量加载数据转换错误(类型不匹配或指定代码页的无效字符).
Jos*_*rts 98
将id列添加到csv文件并将其留空:
id,Name,Address
,name1,addr test 1
,name2,addr test 2
Run Code Online (Sandbox Code Playgroud)
从查询中删除KEEPIDENTITY关键字:
BULK INSERT Employee FROM 'path\tempFile.csv '
WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
Run Code Online (Sandbox Code Playgroud)
id标识字段将自动递增.
如果将值分配给csv中的id字段,除非使用KEEPIDENTITY关键字,否则它们将被忽略,然后将使用它们而不是自动增量.
mar*_*c_s 42
不要直接插入真实表格.
我会永远
dbo.Employee_Staging
(没有IDENTITY
列)然后使用T-SQL语句将数据复制到实际表中,如:
INSERT INTO dbo.Employee(Name, Address)
SELECT Name, Address
FROM dbo.Employee_Staging
Run Code Online (Sandbox Code Playgroud)Pau*_*l_S 27
我有类似的问题,但我需要确保ID的顺序与源文件中的顺序对齐.我的解决方案是使用VIEW进行BULK INSERT:
保持你的表不变并创建这个VIEW(选择除ID列之外的所有内容)
CREATE VIEW [dbo].[VW_Employee]
AS
SELECT [Name], [Address]
FROM [dbo].[Employee];
Run Code Online (Sandbox Code Playgroud)
您的BULK INSERT应该如下所示:
BULK INSERT [dbo].[VW_Employee] FROM 'path\tempFile.csv '
WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
Run Code Online (Sandbox Code Playgroud)
您必须使用格式文件进行批量插入:
BULK INSERT Employee FROM 'path\tempFile.csv '
WITH (FORMATFILE = 'path\tempFile.fmt');
Run Code Online (Sandbox Code Playgroud)
格式文件(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