2017-07-20 146 views
1

我想使用批量插入文件csv插入到SQL Server 2012。相同的列有日期时间,但使用批量插入日期时间格式不起作用,并且我不使用SSIS如何使用批量插入CSV日期时间格式的sql服务器正确?

示例创建表

CREATE TABLE [dbo].[scanindex_test](
    [request_no] [varchar](13) NOT NULL, 
    [request_date] [datetime] NULL, 
    [id_card] [varchar](20) NULL, 
    [firstname] [varchar](100) NULL, 
    [surname] [varchar](100) NULL 
) 

查询SQL Server 2012中:

declare 
    @path  varchar(255), 
    @sql  varchar(5000)   

SET @path = 'C:\Test\TESTFILE.csv'  

set @sql = 'BULK INSERT [dbo].[scanindex_test] FROM ''' + @path + ''' 
     ' + '  WITH (  
       CODEPAGE=''RAW'',   
       FIELDTERMINATOR = '','', 
       ROWTERMINATOR = ''\n'' 
       ) ' 
print @sql 
exec (@sql) 

当我运行查询它的错误:

Msg 4864, Level 16, State 1, Line 1 
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 11, column 2 (request_date). 
Msg 4865, Level 16, State 1, Line 1 
Cannot bulk load because the maximum number of errors (10) was exceeded. 
Msg 7399, Level 16, State 1, Line 1 
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error. 
Msg 7330, Level 16, State 2, Line 1 
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)". 

运行时实例CSV数据文件

request_no | request_date | id_card | firstname | surname 
1   | 12/7/2017  | 1122  | AA   | BB 
2   | 12/7/2017  | 4399  | SS   | EE 
3   | 13/7/2017  | 5599  | QQ   | KK  

结果查询:

但我想导致日期时间格式(YYYY-MM-DD)正确:

request_no | request_date   | id_card | firstname | surname 
1   | 2017-07-12 00:00:00.000 | 1122 | AA  | BB 
2   | 2017-07-12 00:00:00.000 | 4399 | SS  | EE 
3   | 2017-07-13 00:00:00.000 | 5599 | QQ  | KK 

请帮帮我。谢谢提前;)

+0

首先,SQL Server的进口和ETL工具是SSIS,不BCP或BULK INSERT。这些意味着*快速*批量操作。日期解析或任何类型的解析并不快。在这种情况下,您可以使用格式文件,如[使用格式文件批量导入数据]中所示(https://docs.microsoft.com/en-us/sql/relational-databases/import-export/使用格式文件到批量导入数据sql服务器),并指定匹配日期格式的日期字段的排序规则。 –

+0

如果这不起作用,则必须将该文件导入登台表并解析日期字段。你不必这样做,但如果你使用SSIS –

回答

0

您需要将DATEFORMAT更改为DMY。添加以下到你的脚本的顶部应该工作:

SET DATEFORMAT DMY; 

所以,你的完整剧本,应该是:

SET DATEFORMAT DMY; 

declare 
    @path  varchar(255), 
    @sql  varchar(5000)   

SET @path = 'C:\Test\TESTFILE.csv'  

set @sql = 'BULK INSERT [dbo].[scanindex_test] FROM ''' + @path + ''' 
     ' + '  WITH (  
       CODEPAGE=''RAW'',   
       FIELDTERMINATOR = '','', 
       ROWTERMINATOR = ''\n'' 
       ) ' 
print @sql 
exec (@sql) 
+0

据我所知,DATEFORMAT不能与BULK INSERT一起使用。 –

+0

它使用他的样本数据为我工作 – Siyual

+0

@Siyual非常感谢。这是工作; D – nettoon493

相关问题