Postgres ошибка копирования дополнительных данных после последнего ожидаемого столбца из файла BCP SQL Server
Я перемещаю базу данных из 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.
Если я попытаюсь поместить некоторые данные в символ "NUL" в первой строке, то команда копирования выдаст мне "дополнительные данные после последнего ожидаемого столбца" в третьей строке вместо первой строки. Я не могу отредактировать файл и заменить символ "NUL" чем-то другим, поскольку у меня есть сотни таблиц для переноса с некоторыми очень большими таблицами.
Мне нужно либо указать опцию для утилиты BCP SQL Server, либо для команды Postgres COPY, чтобы сделать эту работу.
1 ответ
Как утверждает @Tometzky,
Утилита bcp представляет пустую строку как пустую строку и пустую строку как пустую строку.
это объясняет причину нежелательного поведения.
В качестве альтернативы bcp вы можете использовать для этого ssis (Microsoft SQL Server Integration Services). Он прост в использовании и обладает широким спектром совместимости между системами СУБД.