Ошибка преобразования данных при массовой загрузке, поле типа даты в SQL Server - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть это уникальное задание, в котором мне дан сценарий для базы данных, а также сценарий для массовой вставки и набор данных из примерно 1 300 000 записей.После настройки базы данных я запустил скрипт массовой вставки и получил ошибку преобразования данных массовой загрузки.

Я спросил всех своих друзей, не испытали ли они подобного опыта, но ни у кого из них не было такой же проблемы.Я попытался разобраться в этом, может показаться, что причиной этой ошибки является поле Date в MainTable, поэтому я попытался найти способ установить дату по умолчанию 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, уровень 16,Состояние 1, строка 3
Ошибка преобразования данных при массовой загрузке (несоответствие типов или недопустимый символ для указанной кодовой страницы) для строки 2, столбца 2 (bookDt).

Я получаю ту же ошибку, что иПохоже, что каждая строка в текстовом файле.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Как я уже говорил в своем комментарии, часто проще вставить данные в столбец типа строки в промежуточной таблице, а затем преобразовать значения.Я сделал это только со столбцами даты здесь, но вы можете сделать это для всего лота, если хотите:

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;
0 голосов
/ 23 апреля 2019

Вместо «Set DateFormat dmy» попробуйте следующее:

Set Language N'british'
...