Postgres从SQL Server BCP文件的最后一个预期的列之后复制错误额外的数据

时间:2019-01-21 20:35:19

标签: sql sql-server postgresql database-migration csv-import

我正在将数据库从Windows托管的SQL Server 2016迁移到Debian托管的Postgres 11。

我正在使用BCP实用程序从SQL Server 2016中导出数据,并使用COPY命令将其导入Postgres 11中。

对于很多表它都有效,但是对于某些表,即使我的文件包含相同数量的列,我仍然会收到“最后一个预期列之后的额外数据”错误。 COPY命令似乎对包含空字符串的行有问题,在记事本++中显示为“ NUL”。

这是我在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”字符替换为其他字符,因为我有数百个表要与一些非常大的表一起迁移。

我需要为SQL Server BCP实用程序指定一个选项,或者为Postgres COPY命令指定一个选项,以使这项工作有效。

1 个答案:

答案 0 :(得分:2)

如@Tometzky所述,

  

bcp实用程序将一个空字符串表示为null,将一个空字符串表示为一个空字符串。

这说明了不良行为的原因。

作为的替代方法,您可以考虑以这种方式使用(Microsoft SQL Server集成服务)。它易于使用,并且在DBMS系统之间具有广泛的兼容性。