批量加载数据转换错误,SQL Server中的日期类型字段

问题描述 投票:0回答:2

我有这个uni任务,我给了数据库的脚本以及批量插入的脚本和大约1.300.000记录的数据集。设置数据库后,我运行了批量插入脚本,我收到批量加载数据转换错误。

我问过我所有的朋友他们是否有类似的经历,但他们都没有同样的问题。我试着调查一下,看起来导致这个错误的原因是MainTable中的Date字段,所以我试图找到如何将默认日期设置为DD / MM / YYYY并使用/而不是 - ,我发现的是一些SELECT格式化getdate()函数和SET DATEFORMAT dmy命令,但这并没有修复我的错误。我删除了数据库,现在至少重复了3次这个过程,每次都得到同样的错误。

CREATE TABLE MainTable
(
    bookCode int NULL,
    bookDt date NULL,
    payCode int NULL,
    payMethod char(2) NULL,
    custCode int NULL,
    custName varchar(30) NULL,
    custSurname varchar (30) NULL,
    custPhone varchar (20) NULL,
    staffNo int NULL,
    staffName varchar (30) NULL,
    staffSurname varchar (30) NULL,
    totalCost numeric(19, 2) NULL,
    campCode char(3) NULL,
    campName varchar (50) NULL,
    numOfEmp int NULL,
    empNo int NULL,
    catCode char (1) NULL,
    areaM2 int NULL,
    unitCost numeric(4,2) NULL,
    startDt date NULL,
    endDt date NULL,
    noPers int NULL,
    costPerRental numeric(19, 2) NULL
); 

SET DATEFORMAT dmy

BULK INSERT mainTable
FROM 'C:\DATA\GeneratedData.txt'
WITH (FIRSTROW = 2,FIELDTERMINATOR= ',', ROWTERMINATOR = '\n');

以及数据集中的几条记录:

2615981,14/08/2018,1,CC,990,Christie,BUCKNER,(+30)000-556-7301,5020,Zaria,RACE,45,ROS,Rosibos,200,151,C,30,15,15/08/2018,17/08/2018,1,45
2616347,17/08/2018,3,CA,403,Ashli,MAXWELL,(+30)000-114-8689,5010,Yovonnda,CAZARES,45,ROS,Rosibos,200,151,C,30,15,18/08/2018,20/08/2018,1,45

我得到的错误是这样的:

Msg 4864,Level 16,State 1,Line 3 第2行第2列(bookDt)的批量加载数据转换错误(类型不匹配或指定代码页的无效字符)。

我得到的错误似乎是文本文件中的每一行。

sql-server date-format
2个回答
0
投票

而不是“设置DateFormat dmy”,请尝试以下操作:

Set Language N'british'

0
投票

就像我在评论中所说的那样,通常更容易将数据插入到临时表中的字符串类型列中,然后再转换这些值。我只在这里使用Date列来完成此操作,但如果您愿意,可以将其完成:

USE Sandbox;
GO

CREATE SCHEMA stg;
GO
CREATE TABLE stg.MainTable (bookCode int NULL,
                            bookDt varchar(10) NULL,
                            payCode int NULL,
                            payMethod char(2) NULL,
                            custCode int NULL,
                            custName varchar(30) NULL,
                            custSurname varchar(30) NULL,
                            custPhone varchar(20) NULL,
                            staffNo int NULL,
                            staffName varchar(30) NULL,
                            staffSurname varchar(30) NULL,
                            totalCost numeric(19, 2) NULL,
                            campCode char(3) NULL,
                            campName varchar(50) NULL,
                            numOfEmp int NULL,
                            empNo int NULL,
                            catCode char(1) NULL,
                            areaM2 int NULL,
                            unitCost numeric(4, 2) NULL,
                            startDt varchar(10) NULL,
                            endDt varchar(10) NULL,
                            noPers int NULL,
                            costPerRental numeric(19, 2) NULL);
GO

BULK INSERT stg.MainTable
FROM 'C:\DATA\GeneratedData.txt'
WITH (FIRSTROW = 2,
      FIELDTERMINATOR = ',',
      ROWTERMINATOR = '\n');

GO
CREATE TABLE dbo.MainTable (bookCode int NULL,
                            bookDt date NULL,
                            payCode int NULL,
                            payMethod char(2) NULL,
                            custCode int NULL,
                            custName varchar(30) NULL,
                            custSurname varchar(30) NULL,
                            custPhone varchar(20) NULL,
                            staffNo int NULL,
                            staffName varchar(30) NULL,
                            staffSurname varchar(30) NULL,
                            totalCost numeric(19, 2) NULL,
                            campCode char(3) NULL,
                            campName varchar(50) NULL,
                            numOfEmp int NULL,
                            empNo int NULL,
                            catCode char(1) NULL,
                            areaM2 int NULL,
                            unitCost numeric(4, 2) NULL,
                            startDt date NULL,
                            endDt date NULL,
                            noPers int NULL,
                            costPerRental numeric(19, 2) NULL);

GO
INSERT INTO dbo.MainTable
SELECT bookCode,
       CONVERT(date, bookDt, 103),
       payCode,
       payMethod,
       custCode,
       custName,
       custSurname,
       custPhone,
       staffNo,
       staffName,
       staffSurname,
       totalCost,
       campCode,
       campName,
       numOfEmp,
       empNo,
       catCode,
       areaM2,
       unitCost,
       CONVERT(date, startDt, 103),
       CONVERT(date, endDt, 103),
       noPers,
       costPerRental
FROM stg.MainTable;

TRUNCATE stg.MainTable;
© www.soinside.com 2019 - 2024. All rights reserved.