Postgres ошибка копирования дополнительных данных после последнего ожидаемого столбца из файла BCP SQL Server - PullRequest
0 голосов
/ 21 января 2019

Я перемещаю базу данных из SQL Server 2016, размещенной в Windows, в Postgres 11, размещенную в Debian.

Я экспортирую данные с помощью утилиты BCP из SQL Server 2016 и импортирую их в Postgres 11 с помощью COPYкоманда.

Для многих таблиц это работает, но для некоторых я получаю ошибку «дополнительные данные после последнего ожидаемого столбца», даже если мой файл содержит одинаковое количество столбцов.Кажется, что команда COPY имеет проблемы со строками, которые содержат пустые строки, показанные как «NUL» в Notepad ++.

Вот определение моей таблицы в SQL Server.(имена таблиц и столбцов изменены)

Create table test (
    TypeId  int not null,
    Name    nvarchar(50) not null,
    License nvarchar(50) not null,
    LastChanged timestamp not null,
    Id1 uniqueidentifier not null,
    Id2 uniqueidentifier not null,
    DescriptionCol  nvarchar(256) not null default '',
    ConditionCol    bit not null default 0,
    ConditionCol2   bit not null default 0,
    ConditionCol3   bit not null default 1,
    DescriptionCol2 nvarchar (2) not null default ''
)

А вот определение таблицы в Postgres.

CREATE TABLE test (
    typeid integer NOT NULL,
    name citext COLLATE pg_catalog."default" NOT NULL,
    license citext COLLATE pg_catalog."default" NOT NULL,
    lastchanged bytea NOT NULL,
    id1 uuid NOT NULL,
    id2 uuid NOT NULL DEFAULT uuid_generate_v4(),
    descriptioncol text COLLATE pg_catalog."default" NOT NULL DEFAULT ''::text,
    conditioncol boolean NOT NULL DEFAULT false,
    conditioncol2 boolean NOT NULL DEFAULT false,
    conditioncol3 boolean NOT NULL DEFAULT true,
    descriptioncol2 text COLLATE pg_catalog."default" NOT NULL
)

Я извлекаю данные таким образом:

bcp Database.Schema.test out E:\MyFile.dat -S ServerName -U User -P Password -a65535 -c -C 65001

Затем я подключаюсь к удаленному серверу Postgres и импортирую данные следующим образом:

\copy Schema.test FROM 'E:\MyFile.dat' (DELIMITER E'\t', FORMAT CSV, NULL '', ENCODING 'UTF8');`

Теперь, если я открою файл, созданный в Notepad ++, я увижу символы «NUL», и это, похоже, является проблемой.что команда COPY не может принять.

File in notepad

Если я попытаюсь поместить некоторые данные в символ NUL в первой строке, то команда копированиядает мне «дополнительные данные после последнего ожидаемого столбца» в третьей строке вместо первой строки.Я не могу отредактировать файл и заменить символ «NUL» чем-то другим, поскольку у меня есть сотни таблиц для переноса с некоторыми очень большими таблицами.

Чтобы сделать эту работу, мне нужно либо указать опцию для утилиты BCP SQL Server, либо для команды Postgres COPY.

1 Ответ

0 голосов
/ 22 января 2019

Как утверждает @Tometzky,

Утилита bcp представляет пустую строку как нулевую, а пустую строку - как пустую.

это объясняет причину нежелательного поведения.

В качестве альтернативы , вы можете использовать (Microsoft SQL Server Integration Services) для этого способа. Он прост в использовании и обладает широким спектром совместимости между системами СУБД.

...