带有标识(自动增量)列的BULK INSERT

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关键字,否则它们将被忽略,然后将使用它们而不是自动增量.

  • @FokwaBest - 我想远程服务器没有你的 D: 驱动器的概念。我认为您需要创建一个远程服务器可以访问的共享文件夹,然后以这种方式引用它......类似于\\myshare\data.csv。我不是这里的专家,并且在 sql server 中确实很少工作,所以如果这不起作用,也许其他人可以回答。 (2认同)

mar*_*c_s 42

不要直接插入真实表格.

我会永远

  1. 从CSV文件插入临时dbo.Employee_Staging(没有IDENTITY列)
  2. 可能编辑/清理/操纵导入的数据
  3. 然后使用T-SQL语句将数据复制到实际表中,如:

    INSERT INTO dbo.Employee(Name, Address) 
       SELECT Name, Address
       FROM dbo.Employee_Staging
    
    Run Code Online (Sandbox Code Playgroud)

  • @marc_s虽然这是一个很好的建议,但这并没有回答这个问题.jwerts应该得到最好的答案. (9认同)
  • @Abhi:我可以(1)删除引起悲伤的IDENTITY列,(2)我可以在实际导入真实表之前查看数据,可能删除某些行,更新一些行. (7认同)

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)

  • 这是迄今为止这个问题的最佳解决方案 (2认同)
  • 将批量插入运行到与源文件不匹配的登台表中的最简单,最简单的方法。但是我今天才发现,显然不能保证数据将按文件顺序插入。这是导入大型机头/详细类型文件的杀手 (2认同)

hot*_*ion 8

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

   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