【问题标题】:How use Bulk insert csv to sql server with datetime format correct?如何使用日期时间格式正确的批量插入 csv 到 sql server?
【发布时间】:2017-12-26 07:39:24
【问题描述】:

我想使用批量插入文件 csv 插入 SQL Server 2012。同一列有日期时间,但使用批量插入日期时间格式不起作用,我不使用 SSIS

创建表格示例

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     

运行查询时的结果:

request_no | request_date            | id_card  | firstname | surname
1          | 2017-12-07 00:00:00.000 | 1122     | AA        | BB
2          | 2017-12-07 00:00:00.000 | 4399     | SS        | EE
3  >> Error, because it's look datetime format: 2017-13-07 (yyyy-mm-dd)

但我希望结果日期时间格式 (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

请帮助我。谢谢提前;)

【问题讨论】:

  • 首先,SQL Server的导入和ETL工具是SSIS,不是bcp或者BULK INSERT。这些适用于 fast 批量操作。日期解析或任何类型的解析都不快。在这种情况下,您可以使用Use a Format File to Bulk Import Data 中所示的格式文件,并为与日期格式匹配的日期字段指定排序规则。
  • 如果这不起作用,您必须将文件导入临时表并解析日期字段。如果您使用 SSIS,则不必这样做

标签: tsql datetime sql-server-2012 date-format bulkinsert


【解决方案1】:

您需要将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)

【讨论】:

  • 据我所知,DATEFORMAT 不适用于 BULK INSERT。
【解决方案2】:

它适用于批量插入:

SET DATEFORMAT DMY
BULK INSERT [dbo].[TRX]
        FROM 'C:\..\trx2.txt'
            WITH
    (           
                FIELDTERMINATOR = '\t',
                ROWTERMINATOR = '\n',
                FIRSTROW = 2
    )
PRINT 'BULK INSERT [TRX2]'
GO

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多